当前位置: 首页>>技术教程>>正文


Bash 自动完成环境变量

, ,

问题描述

bash 自动完成功能似乎不适用于 11.04 中的环境变量。当前行为如下所示

export SCRIPT=/home/user/script
cd $SCRIPT/<tab>

导致在 $SCRIPT 之前添加反斜杠( \ ),即提示变为

cd \$SCRIPT/

如果将 cd 替换为 ls 或任何其他命令,则会发生同样的事情

另外,如果 $SCRIPT 中包含的路径中有一个可执行文件并且我想运行它

$SCRIPT/<tab>

Bash 不显示文件夹内的选项(无论环境变量中包含的路径内是单个文件还是多个文件/目录)。

换句话说,自动完成功能不适用于环境变量。

最佳方案

这个错误是在 bash 4.2 中引入的。这里有一个很长的主题:

http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00274.html

简而言之,bash 的开发者 Chet Ramey 还不确定如何修复它。

次佳方案

要恢复旧行为,请使用命令

shopt -s direxpand

或将其包含在您的 .bashrc

如果您在不同版本的 bash 中使用相同的 .bashrc,请使用

if ((BASH_VERSINFO[0] >= 4)) && ((BASH_VERSINFO[1] >= 2))
    then shopt -s direxpand
fi

第三种方案

http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00274.html 中建议的解决方法是:

  1. 使用 <Tab> 到 auto-complete 你的环境变量 s.t.你的命令行说 cd $MYVAR

  2. 点击 <Esc> + <Ctrl>-E 扩展当前命令行,即用它的值替换 $MYVAR,路径

  3. 添加一个 / 然后像往常一样享受 <Tab> auto-completion

这假设您处于 emacs 模式( set -o emacs )并且为 cd 合理设置了 bash_completion (例如 complete -o nospace -F _cd cd )。

不幸的是,这在 vi 模式( set -o vi )下不起作用,因为那时命令行扩展不可用。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/12241.html,未经允许,请勿转载。