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

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

我想使用 bash 指向CDPATH我经常访问的目录的符号链接目录。然而,做:

CDPATH="~/symlinks"

如果两者都存在,则导致cd SUBDIR停止工作;目录优先于当前工作目录。./SUBDIR~/symlinks/SUBDIRCDPATH

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

CDPATH=".:~/symlinks"

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

$ pwd
/foo/bar
$ cd baz
/foo/bar/baz

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

答案1

两条线索:

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

  • bash 手册页说:

该变量CDPATH 定义包含以下内容的目录的搜索路径 dirCDPATH 搜索中的每个目录名称dir。中的备用目录名称CDPATH由冒号 ( ) 分隔:。空目录名CDPATH与当前目录相同,即“.”。

手册页似乎过于简单化:显然,空目录名称(即空字符串)是不是.CDPATH=.生成额外输出但CDPATH=不生成额外输出完全相同。但是,由于空目录在 中是合法的CDPATH,并且空目录不会生成额外的输出,因此我们可以使用:

# The first entry is intentionally an empty string.
CDPATH=":~/symlinks"

测试(使用 bash 4.4.12)确认其行为符合预期:cd SUBDIR更改为./SUBDIR而不是 to~/symlinks/SUBDIR并执行不是打印任何额外的喷出物。

相关内容