在我的 Debian 服务器上,我习惯按 Tab 来“预览” shell 模式的扩展:
$ cp *some*<Tab>
something somewhat have-some-cake
$ cp *some*_
当模式扩展为一个条目时,Tab 会用实际条目替换模式;否则会显示匹配条目的列表。这很直观且有用,因为它与常规“前缀”Tab 补全一致。
但我的 Ubuntu 服务器和桌面表现不同:即使扩展到多个条目,Tab 用第一个条目替换模式。
我检查了常见的嫌疑犯(/etc/bash.bashrc、/etc/inputrc 和本地版本),但没有发现任何区别。
有人知道哪个设置控制这种行为吗?
答案1
相反另一个答案,这特定问题可能是使用 bash-completion 的直接结果。bash-completion 包有几个错误(如这个 U&L 答案例如,关于类似的问题)。
如果我在我的代码中注释掉这一部分.bashrc
:
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
并启动一个新的 bash 实例,然后我得到:
$ echo *o*<tab><tab>
foo food foo.sh
$ echo *o*
然后,如果我/usr/share/bash-completion/bash_completion
像在以下位置一样获取脚本.bashrc
:
$ . /usr/share/bash-completion/bash_completion
$ echo foo
立即自动*o*
完成,foo
而不显示其他匹配。
顺便说一下,我使用的是 16.04。我不知道这个问题在新版本中是否已经修复。
$ dpkg-query --show --showformat='${Package} ${version}\n' bash bash-completion
bash 4.3-14ubuntu1.2
bash-completion 1:2.1-4.2ubuntu1.1
答案2
Bash 中更智能的制表符补全需要该bash-completion
包。
sudo apt install bash-completion
Bash 补全实际上是 Debian 直接编写和维护的。
(另请参阅其Debian 软件包和Ubuntu 软件包页。
一旦安装完成,它就会自动加载(例如通过/etc/bash.bashrc
),或者您需要使用~/.bashrc
如下节指示 Bash 在您的程序中加载它:
if [[ -z "$BASH_COMPLETION" ]] && [[ -r /etc/bash_completion ]]; then
. /etc/bash_completion
fi
在 Red Hat 和其他公司包含此软件包之前,我曾经/etc/bash_completion*
在系统之间手动复制。虽然这样做效果很好,但我不建议这样做;它还会剥夺您的软件包管理器更新现有补全并安装新补全的机会(/usr/share/bash-completion/completions/
尽管它们最初与您的自定义补全一起存在,但现在已进入/etc/bash_completion.d/
)。