Bash 自动完成环境变量

nil*_*hat 28 bash 11.04 environment-variables

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

export SCRIPT=/home/user/script
cd $SCRIPT/<tab>
Run Code Online (Sandbox Code Playgroud)

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

cd \$SCRIPT/
Run Code Online (Sandbox Code Playgroud)

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

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

$SCRIPT/<tab>
Run Code Online (Sandbox Code Playgroud)

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

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

gei*_*rha 16

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

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

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

  • 令我惊讶的是,很少有人抱怨这个。与 bash 多年来的工作方式相比,这是一个巨大的变化。 (9认同)

小智 13

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

shopt -s direxpand
Run Code Online (Sandbox Code Playgroud)

或将其包含在您的 .bashrc

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

if ((BASH_VERSINFO[0] >= 4)) && ((BASH_VERSINFO[1] >= 2))
    then shopt -s direxpand
fi
Run Code Online (Sandbox Code Playgroud)


kyn*_*nan 8

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

  1. 用于<Tab>自动完成您的环境变量 st 您的命令行说cd $MYVAR
  2. 点击<Esc>+<Ctrl>-E扩展当前命令行,即替换$MYVAR为其值,路径
  3. 添加一个/然后<Tab>像往常一样享受自动完成

这假设您处于 emacs 模式 ( set -o emacs) 并且已经bash_completioncd(例如complete -o nospace -F _cd cd) 进行了明智的设置。

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