我发现执行shopt -s nullglob
会禁用文件和目录的tab补全功能,而执行shopt -u nullglob
则可以恢复。为什么目录的tab补全要依赖于nullglob
被取消设置呢?
我使用的是Debian 7操作系统上的Bash 4.2.37(1)-release
版本。
我发现执行shopt -s nullglob
会禁用文件和目录的tab补全功能,而执行shopt -u nullglob
则可以恢复。为什么目录的tab补全要依赖于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如何导致该电子邮件中列出的问题。
编辑:我现在明白发生了什么。问题在于通配符扩展很愚蠢。它将$2[$j]=\${!ref}\${COMP_WORDS[i]}
整个“单词”视为单个通配符并尝试扩展它。通常情况下会失败并保持原样,但对于整个参数使用nullglob
会使其消失(从而导致问题)。
快速测试表明,将此内容替换为:
eval $2[$j]=\${!ref}\${COMP_WORDS[i]}
使用以下任一方法:
eval $2\[$j\]=\${!ref}\${COMP_WORDS\[i\]}
或者:
eval "$2[$j]=\${!ref}\${COMP_WORDS[i]}"
__reassemble_comp_words_by_ref
并在当前文件的顶部进行源控制,似乎可以作为临时解决方法来解决该问题。[]
括号的存在,shell将完成代码中的$2[$j]=\${!ref}\${COMP_WORDS[i]}
行视为glob,并简单地展开整个字符串。如果没有在shell上启用nullglob
,则会保持不变(作为失败的扩展)。对我来说,这确实是令人惊讶的行为。在快速手动测试中,转义该行上的两组[]
(以及循环后面的一组)可以解决问题。将整个参数引用给eval
也可以解决问题。 - Etan Reisner
echo
,程序如ls
,别名等等...我认为这并不重要,因为路径的制表符补全不是特定于某个命令的。我已经在问题中添加了我的 Bash 版本和 Linux 发行版。 - Kyle Strandcomplete
的输出)。 您可以轻松地为特定命令中断自动完成,而不会影响整体自动完成。 - Etan Reisner