Bash Path Completion with Sudo – How It Works

autocompletebashmountpathsudo

Tab path completion does not work (at least on Ubuntu and AFAIK Arch) with

sudo mount <whatever>

The iso file I am trying to mount is not in /etc/fstab. If I just type

mount <whatever>

the completion works (but of course the command fails as I am not root). Apparently it is sudo that breaks it.

How can make completion work with sudo?

It is surprising that with

sudo umount <whatever>

completion works. How is it achieved? Does it look into /etc/fstab?

Solution: I just put a shell script into /usr/local/bin that calls sudo mount ... with the arguments passed to it. Completion works when calling this script since there is no sudo in the way.

Best Answer

This has not at all to do with bash, but it depends on the completions programmed in the package bash-completion.

From some comments in the file /etc/bash_completion.d/mount:

# mount(8) completion. This will pull a list of possible mounts out of
# /etc/{,v}fstab, unless the word being completed contains a ':', which
# would indicate the specification of an NFS server. In that case, we
# query the server for a list of all available exports and complete on
# that instead.
#

# umount(8) completion. This relies on the mount point being the third
# space-delimited field in the output of mount(8)
#

Also, you find in the main file /etc/bash_completion the following comment, that explicitly talk about mount and umount commands:

# A meta-command completion function for commands like sudo(8), which need to
# first complete on a command, then complete according to that command's own
# completion definition - currently not quite foolproof (e.g. mount and umount
# don't work properly), but still quite useful.
#

Update:
The comment about mount and umount commands was removed from bash_completion in the commit:

_command_offset: Restore compopts used by called command.

This fixes completions that rely on their compopts, most notably
mount(8).
Fixes bash-completion bug #313183.

Released in bash-completion 1.90

Related Question