如果您将* nix框设置为LDAP客户端,则可能会出现此问题,甚至以本地用户身份登录也是如此。
无聊的调试信息:使用调试set-x
,我发现挂起的完成项位于:
> set -x
> ls foo<tab>
... <--- lots of output removed
...
+ _quote_readline_by_ref foo quoted
+ '[' -z foo ']'
+ [[ foo == \'* ]] <--- froze here
+ [[ foo == ~* ]] <--- actually causing the trouble
确认:我确认了这一点,ls ~*
它也挂了。原来我的ldap服务器很慢,但这不应该影响bash的完成和ls!
解决方案:啊哈,有一个针对bash-completion + ldap 的bug,它将在较新的版本中修复,并且如果您不想等待,可以修复一个简单的补丁。标签页的完成又很快了,万岁!
这是补丁文件,以防链接消失。它只是在第545和547行上转义〜
--- /usr/share/bash-completion/bash_completion.orig 2014-11-06 10:36:14.981888369 +0100
+++ /usr/share/bash-completion/bash_completion 2014-11-06 10:36:25.142070963 +0100
@@ -542,9 +542,9 @@
elif [[ $1 == \'* ]]; then
# Leave out first character
printf -v $2 %s "${1:1}"
- elif [[ $1 == ~* ]]; then
+ elif [[ $1 == \~* ]]; then
# avoid escaping first ~
- printf -v $2 ~%q "${1:1}"
+ printf -v $2 \~%q "${1:1}"
else
printf -v $2 %q "$1"
fi
您需要退出当前的ssh会话并重新登录,此补丁才能生效。