针对环境变量的Bash自动完成

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

export SCRIPT=/home/user/script cd $SCRIPT/ 

导致在$SCRIPT之前添加\ ,即提示变为

 cd \$SCRIPT/ 

如果用ls或任何其他命令替换cd也会发生同样的事情

此外,如果$ SCRIPT中包含的路径中有可执行文件,我想运行它

 $SCRIPT/ 

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

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

这个bug是在bash 4.2中引入的。 这里有一个冗长的主题:

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

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

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

  1. 使用自动完成环境变量,命令行为cd $MYVAR
  2. + -E展开当前命令行,即用其值(路径)替换$MYVAR
  3. 添加一个/然后像往常一样享受自动完成

这假设你处于emacs模式( set -o emacs )并且为cd设置了明智的bash_completion (例如complete -o nospace -F _cd cd )。

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

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

 shopt -s direxpand 

或将其包含在.bashrc

如果你使用相同的.bashrc和不同版本的bash,请使用

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

输入shell变量后

 cd $SCRIPT/ 

键入Cntrl-Alt-E。 这扩展了变量

 cd /home/user/script/ 

这适用于Fedora 16中的EDITOR = vi。