Bash 路径补全如何与 sudo 一起使用?

Bash 路径补全如何与 sudo 一起使用?

Tab 路径补全不起作用(至少在 Ubuntu 和 AFAIK Arch 上)

sudo mount <whatever>

我尝试挂载的 iso 文件不在/etc/fstab.如果我只是输入

mount <whatever>

完成工作有效(但当然命令失败,因为我不是 root)。显然正是它sudo打破了它。

如何使用 sudo 完成补全工作?

令人惊讶的是,与

sudo umount <whatever>

竣工工程。它是如何实现的?它调查吗/etc/fstab

解决方案:我只是将一个 shell 脚本放入/usr/local/bin该调用中sudo mount ...,并将参数传递给它。调用此脚本时可以完成工作,因为没有任何sudo障碍。

答案1

bash这与包中编程的完成完全无关bash-completion

从文件中的一些评论来看/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)
#

此外,您在主文件中发现/etc/bash_completion以下注释,明确讨论mountumount命令:

# 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.
#

更新:关于和命令 的
注释已从mountumountbash_completion犯罪:

_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.

已发布bash-completion 1.90

答案2

通过查看以下内容可以轻松解决此问题拱门维基:

在输入诸如 之类的命令后,自动完成功能(按键盘上的 Tab 键两次)非常有用sudo

为此,请将此格式的行添加到您的~/.bashrc文件中:

完整-cf你的命令

例如,要在sudo和后启用自动完成man

complete -cf sudo
complete -cf man

答案3

不,它不会在 fstab 中查找。 Bash 补全会查找路径中的命令、bashrc 和/或 bash_profile 中的别名以及路径。因此,如果您输入类似的内容,sudo mount /mnt/some_folder它应该会自动完成。也许当您执行此操作时,umount您正处于目的地的相对路径中,并且它会自动完成。

答案4

我想 bash 不想太复杂并保持可移植性,因此他们不会在 /dev 中查找以建议完成安装操作。

但是,当调用 umount 时,它可以轻松查看 df/mount/etc 的输出,以了解安装了哪些设备以及安装在何处。

也许 zsh 会提供挂载的完成,哎呀 zsh 甚至在执行 scp 命令时自动完成......

相关内容