防止路径自动完成在 bash 中使用 CDPATH?

Pau*_*cas 5 bash autocomplete

在我的 Mac 上,bash(版本 3.2.53(1))使用当前目录中的文件自动完成命令行参数。

在工作的 Linux 机器上,bash(版本 4.1.2(1))使用当前目录父目录中的文件自动完成命令行参数。

例如,给定目录树:

/home/pjl/
    bin/
    foo/
        book/
Run Code Online (Sandbox Code Playgroud)

如果在我的 Mac 上我这样做:

$ cd foo
$ cd b<TAB>
$ cd book
Run Code Online (Sandbox Code Playgroud)

bash自动完成到book. 但是,当我在 Linux 机器上执行完全相同的操作时:

$ cd foo
$ cd b<TAB>
bin book
$ cd b
Run Code Online (Sandbox Code Playgroud)

bash 提供了两种选择:book来自当前目录 bin来自父目录。

如何使用当前目录使 bash 自动完成(就像在我的 Mac 上一样)?

两台机器上,我确实CDPATH设置为:

.:..:../..:../../..:../../../..:../../../../..:/home/pjl/src:/home/pjl
Run Code Online (Sandbox Code Playgroud)

如果我CDPATH在 Linux 机器上取消设置,那么 bash 将使用当前目录(这是我想要的)自动完成;因此我知道 Linux 上的 bash 正在使用CDPATH.

但是我如何保持CDPATH设置(所以cd'ing 像以前一样工作),但在执行自动完成时使用 bash CDPATH


另一种可接受的行为是让自动完成有利于当前目录,并CDPATH 在且仅当当前目录中没有任何内容匹配时才使用。

ST0*_*ST0 3

正确的方法是在~/.bashrc上面建议的 @Gilles 中使用以下内容(此处较短的版本):

_my_cd () { CDPATH= _cd "$@";}
Run Code Online (Sandbox Code Playgroud)

更好的方法是检查CDPATH当且仅当本地未找到匹配项时:

_my_cd () { CDPATH= _cd "$@"; if [ -z "$COMPREPLY" ]; then _cd "$@"; fi;}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以获得可编程完成的功能,而不会造成麻烦。不要忘记

complete -F _my_cd cd
Run Code Online (Sandbox Code Playgroud)

由于某种原因/usr/share/bash-completion/bash_completion(尽管似乎是默认的),所以你不妨:-o nospacecdnospace

complete -F _my_cd -o nospace cd
Run Code Online (Sandbox Code Playgroud)