Bash 完成抛出语法错误

Bash 完成抛出语法错误

问题:

假设我正在尝试更改为名为“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)。也许我正在查找错误的文件。

  • 我发现gitgedit、 等命令的补全功能可以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>

相关内容