如何修复命令替换中损坏的 bash 完成?

如何修复命令替换中损坏的 bash 完成?

看来我的bash-completion已经损坏了。每次我尝试使用命令替换时,例如当我键入时

ls $(ls Deskto<Tab>

..结果是..

ls $(ls Desktobash unexpected eof while looking for matching ")".

我尝试删除我的.bashrc文件并cp /etc/skel/bashrc ~/获取一个新文件。直到我将一些内容添加到新的 bashrc 中为止,这才有效。即使我echo '#" >> ./.bashrc这样做,它也会再次破裂。删除我的bash_aliases也没有帮助。

sudo apt-get install --reinstall bash-completion没有做到这一点。然而,有一些关于类似问题的线程,没有任何效果。

任何提示将不胜感激! :)

答案1

你的bash-completion并没有真正“损坏”——这只是一个已知的错误与 bash-completion 2.1 和 Bash 4.3 一起使用。

我最近回答过一个相关的问题在 AskUbuntu 和然后又在这里,但既然我在这里,我也会在这里回答,以便谷歌搜索这个问题的人也能在这里找到答案。

我提供了更多细节在 AskUbuntu,但本质上,要修复它,您可以:

  1. 代替

    [[ ${!2} == \$* ]] && eval $2=${!2}
    

    [[ ${!2} == \$\'* ]] && eval $2=${!2}
    

    _quote_readline_by_ref在文件中的函数中/usr/share/bash-completion/bash_completion(不推荐);或者

  2. 查看最新的 Git 版本bash 完成库并使用它 - 该错误似乎在此版本中得到修复。

使用这些解决方案中的任何一个,您都不会在命令替换中再次使用制表符完成功能,但至少,您不会再看到该错误消息。

要真正在命令替换中实现制表符补全,您必须恢复到早期的 Bash 版本(我听说它正在工作),或者等待库通过 Bash 4.3 真正解决该问题。

答案2

可能导致这种情况的一件事是给local关键字起别名;避免使用别名关键字,如localdodone等。

答案3

首先我会看看/etc/bash_completion它应该看起来像

. /usr/share/bash-completion/bash_completion

(不要错过.行首的 )如果没有帮助,我将尝试查找 bash 文件中的所有链接

find / -name *bash* -type f -exec grep -l completion {} \+ 2>/dev/null

并检查是否有错误。在某些文件中应该有以下代码

if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

相关内容