Hello Gabriel, I found the cause. It is the wrapper function have() of the obviously newer function _have() in the shell script
/usr/share/bash-completion/bash_completion As shown there, have() is still kept for backwards compatibility reasons: --------------------------------------8<----------------------------------------- # This function checks whether we have a given program on the system. # _have() { # Completions for system administrator commands are installed as well in # case completion is attempted via `sudo command ...'. PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &>/dev/null } # Backwards compatibility for compat completions that use have(). # @deprecated should no longer be used; generally not needed with dynamically # loaded completions, and _have is suitable for runtime use. have() { unset -v have _have $1 && have=yes } --------------------------------------8<----------------------------------------- If have() is used AND bash-completion script is stored into directory /usr/share/bash-completion/completions completion does not work anymore. If the script with the old have() function is stored in the path /etc/bash_completion.d/ it will work as reported earlier. If we replace have() by _have() or simply remove it in the bash completion script (like many other do) it will work in both storage paths. -- Jürgen