问题:
假设我正在尝试更改为名为“build”的目录,该目录位于我当前所在的目录中。我开始:
cd b
然后我按一次 Tab 键(知道当前目录中没有其他目录以字母 开头b
)。我希望看到以下内容,准备好根据需要点击返回或更改或增强。
cd build
然而,在我运行 Linux Peppermint 3 的上网本上,我发现当我按下选项卡按钮时会出现以下情况:
cd bbash: command substitution: line 74: syntax error near unexpected token `done'
bash: command substitution: line 74: ` done'
我尝试过的事情:
我尝试重新安装“bash-completion”包,但这没有明显效果。
我查看了该文件
/etc/bash_completion
,特别是第 74 行,但我看不到任何明显需要更正的内容 (complete -f -X '*.Z' compress znew
)。也许我正在查找错误的文件。我发现
git
、gedit
、 等命令的补全功能可以node
正常工作。但尝试自动完成文件名kate
也不起作用。当我运行
bash -x
调试时,终端中打印了很多代码,这是在最后(注意注释):+ toks=(${toks[@]-} $( compgen -d -- "$quoted" | { while read -r tmp; do # TODO: I have removed a "[ -n $tmp ] &&" before 'printf ..', # and everything works again. If this bug suddenly # appears again (i.e. "cd /b<TAB>" becomes "cd /"), # remember to check for other similar conditionals (here # and _filedir_xspec()). --David printf '%s\n' $tmp done } )) bash: command substitution: line 74: syntax error near unexpected token `done' bash: command substitution: line 74: ` done'
我尝试将提到的条件添加回去,但这没有效果。
我尝试过暂时删除,
etc/bash_completion.d
但这没有效果。我试图
complete -p
查看已完成的列表,但我真的不知道我在寻找什么。
最后的请求
如果需要的话,我愿意亲自动手编写 shell 脚本;在这个过程中我可以更多地了解这一点。我真的很想把它修好。任何建议表示赞赏。
答案1
Bash 补全是模块化的;不同的包提供自己的完成扩展。另一个包可能包含该错误。尝试mv /etc/bash_completion.d{,.old}
看看是否可以解决问题。如果是这样,请再次将其移回原处,然后将各个文件一一mv /etc/bash_completion.d{.old,}
移出该目录,以找出导致问题的文件。 /etc/bash_completion.d
(该目录在 Peppermint 上的名称可能略有不同。)
答案2
还不能正式发表评论,所以我将提供指向另一个方向的部分答案。你能检查一下你的按键绑定吗?
$ bind -p | grep -i tab
我过去遇到过人们决定将 Tab 键与功能绑定的环境。另一种选择是使用“-x”参数分叉 bash shell,如下所示:
$ bash -x
重复您的测试。如果您使用echo
代替也会发生这种情况吗cd
?
$ echo b <tab>