nullglob 禁用路径名制表符补全

Kyl*_*and 5 bash glob autocomplete bash-completion shopt

我发现这shopt -s nullglob显然禁用了文件和目录的制表符完成,并shopt -u nullglob恢复了它。为什么目录的制表符完成显然依赖于nullglob未设置?

4.2.37(1)-release在 Debian 7 上使用 Bash 。

Eta*_*ner 3

这显然是 bash-completion 的一个已知问题,并被列为 3.0 版本中要修复的目标。

但显然至少从 2012 年开始就是这样。

请参阅https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=666933以供参考。

编辑:至少2011年:http://thread.gmane.org/gmane.comp.shells.bash.completion.devel/3652

但我根本不明白 nullglob 如何导致该电子邮件中列出的问题。

编辑:我现在明白发生了什么。问题是全局扩展是愚蠢的。它将整个“单词”$2[$j]=\${!ref}\${COMP_WORDS[i]}视为一个整体并尝试扩展它。通常情况下,这会失败,它会被单独留下,但nullglob整个论证就会消失(从而导致问题)。

快速测试表明替换它:

eval $2[$j]=\${!ref}\${COMP_WORDS[i]}
Run Code Online (Sandbox Code Playgroud)

与以下任一:

eval $2\[$j\]=\${!ref}\${COMP_WORDS\[i\]}
Run Code Online (Sandbox Code Playgroud)

或者:

eval "$2[$j]=\${!ref}\${COMP_WORDS[i]}"
Run Code Online (Sandbox Code Playgroud)

似乎解决了问题。但我不能保证其中任何一个都是完全正确的修复。

更新:这已经在 debian bash-completion git 存储库中修复了(以一种我没有想到的方式,但显然更好)。

这个提交修复了它。还有其他与通配符相关的修复。

从 git head 中获取__reassemble_comp_words_by_ref并在当前头部之上进行采购似乎可以作为临时解决方法/解决方案来解决问题。