为什么我不能使用 cd 来使用 shell 变量的制表符扩展/自动完成功能?

为什么我不能使用 cd 来使用 shell 变量的制表符扩展/自动完成功能?

我在以下位置设置了一个变量.bashrc

export SOME_DIR=/path/to/some/dir

现在,ls我可以输入ls $SOME_DIR[tab]并且变量将被扩展,然后当深入文件系统时我可以使用制表符自动完成。但是,如果我尝试cd $SOME_DIR[tab]cd $SOME_DIR/[tab],什么也不会发生。

为什么这只适用于ls?有可能让它与 一起工作吗cd
我尝试添加shopt -s direxpand.bashrc, 没有效果:

答案1

显然shopt -s direxpand可以与除内置cd.所以我只是添加alias xy=cd到我的个人资料中,并且工作方式与使用 TAB 的工作方式xy相同。 (谁能想到事情会这么简单?)cddirexpand

答案2

在 Cygwin 中,我遇到了同样的问题,必须将 shell 变量括在引号中。例如,cd $ccc 不会扩展,但cd "$ccc"会扩展,并且您的光标仍在右侧引号之前。

答案3

也许您没有目录/path/to/some/dir/?我刚刚尝试了cd $SOME_DIR/[tab]我的系统并且它有效。

答案4

我在(旧)bash 4.2.37 中遇到了几乎相同的问题,而在 bash 4.3 或 4.4 中则没有。
也就是说:扩展适用于 ,ls但不适用于cd


但是,作为辅助键绑定,我已经定义了(来自 eS潘):

Ctrl-s在我的~/.inputrc

Control-s: shell-expand-line

这允许我输入:cd $SOME_DIR然后Ctrl-s将变量扩展为:

cd /path/to/some/dir

同样有用的键绑定是(来自G吊球):

Ctrl-g也在我的~/.inputrc

Control-g: glob-expand-word

这允许我输入ls b*然后Ctrl-g得到b*扩展:

$ ls b*<kbd>Ctrl</kbd>-<kbd>s</kbd>
$ ls bash.html_node.tar.gz bash.pdf

这还允许我编辑命令行并根据需要添加或删除元素。

相关内容