nullglob 禁用路径名制表符完成
nullglob disables pathname tab-completion
我发现 shopt -s nullglob
显然禁用了文件和目录的制表符完成功能,而 shopt -u nullglob
恢复了它。为什么目录的制表符完成显然依赖于 nullglob
未设置?
我在 Debian 7 上使用 Bash 4.2.37(1)-release
。
这显然是 bash-completion 的一个已知问题,被列为 objective 将在 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 是如何导致该电子邮件中列出的问题的。
编辑:我现在明白发生了什么。问题是全局扩展是愚蠢的。它将 entire "word" [$j]=${!ref}${COMP_WORDS[i]}
视为单个 glob 并尝试扩展它。通常这会失败并且它会被单独留下但是 nullglob
整个论点都会消失(从而导致问题)。
快速测试表明替换这个:
eval [$j]=${!ref}${COMP_WORDS[i]}
有:
eval \[$j\]=${!ref}${COMP_WORDS\[i\]}
或:
eval "[$j]=${!ref}${COMP_WORDS[i]}"
似乎可以解决问题。不过,我不能保证其中任何一个都是完全正确的修复方法。
更新:这已经在 debian bash-completion git 存储库中修复(以一种我没有想到但显然更好的方式)。
This commit 修复它。还有其他与 globbing 相关的修复。
从 git 头部抓取 __reassemble_comp_words_by_ref
并将其置于当前头部之上似乎可以作为临时 workaround/solution.
解决问题
我发现 shopt -s nullglob
显然禁用了文件和目录的制表符完成功能,而 shopt -u nullglob
恢复了它。为什么目录的制表符完成显然依赖于 nullglob
未设置?
我在 Debian 7 上使用 Bash 4.2.37(1)-release
。
这显然是 bash-completion 的一个已知问题,被列为 objective 将在 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 是如何导致该电子邮件中列出的问题的。
编辑:我现在明白发生了什么。问题是全局扩展是愚蠢的。它将 entire "word" [$j]=${!ref}${COMP_WORDS[i]}
视为单个 glob 并尝试扩展它。通常这会失败并且它会被单独留下但是 nullglob
整个论点都会消失(从而导致问题)。
快速测试表明替换这个:
eval [$j]=${!ref}${COMP_WORDS[i]}
有:
eval \[$j\]=${!ref}${COMP_WORDS\[i\]}
或:
eval "[$j]=${!ref}${COMP_WORDS[i]}"
似乎可以解决问题。不过,我不能保证其中任何一个都是完全正确的修复方法。
更新:这已经在 debian bash-completion git 存储库中修复(以一种我没有想到但显然更好的方式)。
This commit 修复它。还有其他与 globbing 相关的修复。
从 git 头部抓取 __reassemble_comp_words_by_ref
并将其置于当前头部之上似乎可以作为临时 workaround/solution.