我们知道有些命令对某些文件/目录不起作用。例如,我们无法对文件使用“cd”命令,当我们尝试按 Tab 键完成行时,系统不会显示任何文件供我们完成。
但是当我尝试使用自动完成功能完成以“.a”结尾的文件名时,我遇到了一个有趣的场景。我可以如下解释这种情况:
[root@myserver multipath]# ls -1
idlist
idlist.a
idlist.b
multipath.a
multipath.sh
我在一个目录中有这些文件。
- 当我输入“vim m”然后按“tab”键时,系统自动将该命令完成为“vim multipath.sh”。
- 当我输入“vim idlist”并按下“tab”键时,系统会显示两个选项:“idlist”和“idlist.b”。没有“idlist.a”选项。
- 最后,当我使用“cat(或其他任何内容)”时,系统会显示以“.a”结尾的文件(带有所有选项)。那里没有任何令人困惑的东西。
“.a” 背后有什么秘密?为什么当我们使用 vi/vim 命令时系统无法完成这个文件?
答案1
在我的 Kubuntu 中没有/usr/share/bash-completion/completions/vim
文件,但是文件
/usr/share/bash-completion/bash_completion
包含此行:
_install_xspec '*.@(o|so|so.!(conf|*/*)|a|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)' vi vim gvim rvim view rview rgvim rgview gview emacs xemacs sxemacs kate kwrite
请注意,有很多不同工具的线路。
如果我启用set -x
然后vim
tab,我会看到该模式被多次使用,最后甚至使用大写版本,如下所示:
compgen -f -X '!!(*.@(o|so|so.!(conf|*/*)|a|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)|*.@(O|SO|SO.!(CONF|*/*)|A|[RS]PM|GIF|JP?(E)G|MP3|MP?(E)G|AVI|ASF|OGG|CLASS))' --
我暂时|a
从bash_completion
文件中删除了。 的新实例bash
开始识别*.a
(和*.A
)文件。
我相信该模式指定的文件通常不想以文本形式编辑。此列表(显然不区分大小写)告诉我们a
可能表示 Unix 中的库。我猜这就是排除它的原因。注意o
和so
是 Unix 中二进制文件的其他常见扩展名,它们也属于该模式。
答案2
就我而言,我无意中关闭了 posix 选项。
set +o posix
恢复了选项卡文件名完成功能。