问题描述
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 中建议的解决方法是:
-
使用
<Tab>
到 auto-complete 你的环境变量 s.t.你的命令行说cd $MYVAR
-
点击
<Esc>
+<Ctrl>-E
扩展当前命令行,即用它的值替换$MYVAR
,路径 -
添加一个
/
然后像往常一样享受<Tab>
auto-completion
这假设您处于 emacs 模式( set -o emacs
)并且为 cd
合理设置了 bash_completion
(例如 complete -o nospace -F _cd cd
)。
不幸的是,这在 vi 模式( set -o vi
)下不起作用,因为那时命令行扩展不可用。