2

假设我们有这样的环境:

mkdir -p /tmp/foo/bar/
export TEST=/tmp/foo

开箱即用,$TEST 的 bash 完成非常不一致。证人:→

$ cd $TES<Tab>     →  $ cd $TEST<cursor>
$ cd $TEST<Tab>    →  $ cd $TEST<cursor>
$ cd $TEST/<Tab>   →  $ cd $TEST/<cursor> 
$ cd $TEST/b<Tab>  →  $ cd $TEST/b<cursor>        # no actual completion!

$ ls $TES<Tab>     →  $ ls $TES<cursor>           # no actual completion!
$ ls $TEST<Tab>    →  $ ls $TEST<cursor>          # same
$ ls $TEST/<Tab>   →  $ ls /tmp/foo/bar/<cursor>  # expands var, annoying!

$ echo $TES<Tab>   →  $ echo $TEST <cursor>        # with a space, annoying!
$ echo $TEST<Tab>  →  $ echo $TEST <cursor>        # same
$ echo $TEST/<Tab> →  $ echo /tmp/foo/bar/<cursor> # expands var, annoying!

将此与例如 tcsh 完成完成的方式进行比较,后者总是完成$TES$TEST/(如果$TEST扩展为目录名)或到$TEST(如果没有)并且从不扩展任何内容。在我的傲慢看来,这就是正确的事情,而 bash 完全错误。

所以问题很明显。是否有可能让 bash 也做正确的事情,如果可以,怎么做?我试图理解手册,但没有多大成功。

4

1 回答 1

1

Bash 中的 Tab 补全非常可配置且非常复杂。如果您使用的是 Ubuntu,请注意https://bugs.launchpad.net/ubuntu/+source/bash-completion/+bug/769866

于 2011-08-03T04:51:18.697 回答