Bash自动完成环境变量[关闭]


25

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

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

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

cd \$SCRIPT/

如果cdls或任何其他命令代替,也会发生相同的情况

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

$SCRIPT/<tab>

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

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



我认为这与bash版本(4.1或4.2)无关。我刚刚从源代码安装了bash-4.1,并使用了它而不是4.2.24(Ubuntu 12.04的版本;从源代码安装,因此我不必在每次sys升级时都“保留”软件包)和行为完全一样 非常非常烦人……

4
这个问题似乎不合时宜,因为它与旧的不受支持的版本中的错误有关。该缺陷被描述这里并一直固定在12.04及更高版本
沃伦·希尔

1
@WarrenHill这可能是题外话,因为它是关于一个错误的(出于这个原因,我投票决定将其关闭)。但是,该错误位于不受支持的发行版中是无关紧要的- 当受影响的发行版的EoL日期到来时,我们不会关闭具有脱题答案的旧问题。只有新的/未回答的EoL问题是题外话的。
卡根

Answers:


13

此错误是bash 4.2中引入的。这里有一个漫长的话题:

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

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


有没有办法恢复到bash 4.1?
nilchat

1
一个修复程序正在进行中:Chet添加了一个“ direxpand” shopt以恢复旧的行为。还没有在Oneiric中。
尼尔森

8
令我惊讶的是,很少有人抱怨这一点。与bash多年来的工作方式相比,这是一个巨大的变化。
Scott C Wilson

11

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

shopt -s direxpand

或将其包含在您的 .bashrc

如果您将同一.bashrc与不同版本的bash一起使用,请使用

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

1
对于bash 5.0和5.1,该测试将失败。
基思·汤普森

8

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

  1. 用于<Tab>自动完成环境变量,您在命令行中说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)中不起作用,因为那时命令行扩展不可用。


2

键入shell变量后

cd $SCRIPT/

输入Cntrl-Alt-E。这扩大了变量

cd /home/user/script/

这在Fedora 16中的EDITOR = vi上有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.