我注意到 Bash 的 Tab 补全功能在文件名方面存在不良行为,我想知道是否有人知道如何修复。假设我有一个目录,里面有很多文件,但只有一个文件具有特定的扩展名(例如 .c)
$ ls
file.c file1 file2 file3
当我有一个包含大量文件的目录时,我知道我想要引用的唯一文件的扩展名,我经常发现使用通配符(即 *.c)通过扩展名引用它很有用。因此,我会输入ls *.c
然后使用 <Tab> 来确保我对所想文件的判断正确。但是我注意到这对我来说不起作用,至少不是我记得的那样。我想我已经将问题缩小到与标准 bash_completion 脚本有关。在我的 Ubuntu 系统上,该脚本位于/usr/share/bash-completion/bash_completion
。当我运行 bash 而不获取该脚本(或者只是使用 完全关闭 bash 可编程完成shopt -u progcomp
)时,我得到了我期望的行为。我相信那是因为制表符补全随后会回退到 Readline 默认值。但是,对我来说,关闭可编程完成似乎有点小题大做,因为这样做会失去很多不错的制表符补全,所以这种权衡并不值得。
我对此并不确定,但我假设使用 bash 时,其思路应该是您拥有 Readline 提供的默认 (tab) 文件名补全,然后 bash_completion 包在此基础上构建更复杂、更有用的制表符补全逻辑。然而,对于我的*.c
情况,bash_completion 逻辑似乎改变/破坏了以前的行为。有人遇到过这种情况并知道解决办法吗?