Bash nullglob禁用路径名选项卡完成

Bash nullglob禁用路径名选项卡完成,bash,autocomplete,glob,bash-completion,shopt,Bash,Autocomplete,Glob,Bash Completion,Shopt,我发现shopt-s nullglob显然会禁用文件和目录的制表符完成,而shopt-u nullglob会恢复它。为什么目录的制表符完成显然依赖于取消设置nullglob 我在Debian 7上使用Bash4.2.37(1)-release。这显然是Bash完成时的一个已知问题,并被列为3.0版本中要解决的目标 但显然,至少从2012年起就一直如此 请参阅以供参考 编辑:至少2011年: 我根本不明白nullglob是如何导致该电子邮件中列出的问题的 编辑:我现在明白发生了什么。问题是全球扩张

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


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

这显然是Bash完成时的一个已知问题,并被列为3.0版本中要解决的目标

但显然,至少从2012年起就一直如此

请参阅以供参考

编辑:至少2011年:

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

编辑:我现在明白发生了什么。问题是全球扩张是愚蠢的。它将整个“word”
$2[$j]=\${!ref}\${COMP\u WORDS[i]}
视为一个单独的glob,并尝试将其展开。通常情况下,这会失败,它会被单独保留,但整个参数上的
nullglob
会消失(从而导致问题)

快速测试表明,更换此:

eval $2[$j]=\${!ref}\${COMP_WORDS[i]}
与以下任何一项:

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

似乎解决了这个问题。但我不能保证这两种方法都是完全正确的

更新:这已经在debian bash completion git存储库中修复了(在某种程度上我没有想到,但显然更好)

修复它。还有其他与globbing相关的修复程序


从git head抓取
\u ref重新组装\u comp\u words\u,并在当前的基础上找到它,似乎可以作为临时解决方法/解决方案来解决问题。

我在这里看不到这一点。什么版本的bash?什么分布?你用什么命令来测试它?@EtanReisner各种命令——内置的如
echo
、程序如
ls
、别名……我认为这无关紧要,因为路径的制表符完成不是命令特定的。我已经将我的Bash版本和Linux发行版添加到了这个问题中。实际上,制表符完成是特定于命令的(有关更多信息,请参阅
complete
的输出)。您可以轻松地中断特定命令的完成,而不中断一般的完成。我在我的debian机器上也看到了这一点,但在CentOS 5机器上没有看到。问题似乎出在
\u rebomble\u comp\u words\u by\u ref
函数中,但我还不明白发生了什么。我同意。更令人失望的是,我没有看到任何人讨论问题的实质。我很想把第二个链接中的报告作为一个问题发布,看看是否有人能解释那里发生了什么,因为我不理解它。我已经看到了很多情况(我认为git完成代码中的一些情况)出现了中断,因为它试图使用glob的默认行为,而没有意识到设置了nullglob。nullglob在许多方面都更好,但是如果代码在本地将nullglob设置为off,并在之后恢复,那么使用旧式的一些代码将返回通配符失败,这并没有什么错。但事实并非如此。结果将类似于IFS在类似情况下的使用方式。提示再次查看此信息,我现在明白了为什么事情会变得混乱。shell将完成代码中的
$2[$j]=\${!ref}\${COMP\u WORDS[i]}
行视为一个glob(因为
[]
括号),并简单地将整个字符串展开。如果shell上没有
nullglob
,它将保持独立(作为失败的扩展)。在我看来,这的确是一种令人惊讶的行为。在快速手动测试中,对该行上的两组
[]
进行转义(以及循环后的一组)可以修复问题。将整个参数引用到
eval
,也是如此。
eval "$2[$j]=\${!ref}\${COMP_WORDS[i]}"