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
以下注释,明确讨论mount
和umount
命令:
# 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.
#
更新:关于和命令 的
注释已从mount
umount
bash_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.
答案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 命令时自动完成......