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

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

最佳答案

这显然是 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 如何导致该电子邮件中列出的问题。

编辑:我现在明白发生了什么。问题是 glob 扩展是愚蠢的。它将 整个 “词” $2[$j]=\${!ref}\${COMP_WORDS[i]} 视为单个 glob 并尝试扩展它。通常这会失败并且它会被单独处理,但是整个参数上的 nullglob 只会消失(从而导致问题)。

快速测试表明替换它:

eval $2[$j]=\${!ref}\${COMP_WORDS[i]}

与:
eval $2\[$j\]=\${!ref}\${COMP_WORDS\[i\]}

或者:
eval "$2[$j]=\${!ref}\${COMP_WORDS[i]}"

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

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

This commit 修复了它。还有其他与通配符相关的修复。

从 git head 获取 __reassemble_comp_words_by_ref 并在当前代码之上获取它似乎可以将问题作为临时解决方法/解决方案来解决。

关于bash - nullglob 禁用路径名制表符补全,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29907892/

10-10 17:39