在我的 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
在且仅当当前目录中没有任何内容匹配时才使用。
正确的方法是在~/.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 nospace
cd
nospace
complete -F _my_cd -o nospace cd
Run Code Online (Sandbox Code Playgroud)