在某些情况下,使用 Tab 按钮的 Bash 自动完成无法完成

在某些情况下,使用 Tab 按钮的 Bash 自动完成无法完成

我们知道有些命令对某些文件/目录不起作用。例如,我们无法对文件使用“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然后vimtab,我会看到该模式被多次使用,最后甚至使用大写版本,如下所示:

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))' --

我暂时|abash_completion文件中删除了。 的新实例bash开始识别*.a(和*.A)文件。

我相信该模式指定的文件通常不想以文本形式编辑。此列表(显然不区分大小写)告诉我们a可能表示 Unix 中的库。我猜这就是排除它的原因。注意oso是 Unix 中二进制文件的其他常见扩展名,它们也属于该模式。

答案2

就我而言,我无意中关闭了 posix 选项。

set +o posix

恢复了选项卡文件名完成功能。

相关内容