使用 CDPATH=".:/some/path" 时,如何禁止打印子目录的完整路径?

jam*_*lin 3 bash cd-command

我想使用 bashCDPATH指向我经常访问的目录的符号链接目录。但是,这样做:

export CDPATH="~/symlinks"
Run Code Online (Sandbox Code Playgroud)

导致cd SUBDIR停止工作,如果./SUBDIR~/symlinks/SUBDIR同时存在; CDPATH目录优先于当前工作目录。

我尝试使用以下方法解决此问题:

export CDPATH=".:~/symlinks"
Run Code Online (Sandbox Code Playgroud)

这确实解决了优先级问题,但现在cd到子目录总是打印其完整路径:

$ pwd
/foo/bar
$ cd baz
/foo/bar/baz
Run Code Online (Sandbox Code Playgroud)

这有点烦人。我知道我可以通过执行抑制所有cd输出alias cd='> /dev/null cd',但我确实喜欢为其他CDPATH条目(或执行cd -)打印的路径。有什么我可以做的更好的吗?

jam*_*lin 5

两条线索:

  • 如果CDPATH不存在或为空字符串,则cd SUBDIR工作正常并且不会打印额外的 spew。

  • bash 联机帮助页说:

    可变CDPATH 限定用于包含该目录的搜索路径 dir:在每个目录名称 CDPATH 中搜索dir。中的替代目录名称CDPATH由冒号 ( :)分隔。inCDPATH中的空目录名与当前目录相同,即“.”。

该手册页似乎过于简单化了:明明一个空目录名(即空字符串)是完全一样的.,因为CDPATH=.产生额外的输出,但CDPATH=没有。但是,由于空目录在 中是合法的CDPATH,并且由于空目录不会生成额外的输出,因此我们可以使用:

# The first entry is intentionally an empty string.
export CDPATH=":~/symlinks"
Run Code Online (Sandbox Code Playgroud)

测试(使用bash 4.4.12)证实,表现为期望:cd SUBDIR更改./SUBDIR,而不是到~/symlinks/SUBDIR和没有打印任何多余的渗出。

  • 不要导出 CDPATH。请参阅 https://mywiki.wooledge.org/BashPitfalls#pf48 (2认同)