在cd、bash帮助页面中:
The variable CDPATH defines the search path for the directory containing
DIR. Alternative directory names in CDPATH are separated by a colon (:).
A null directory name is the same as the current directory. If DIR begins
with a slash (/), then CDPATH is not used.
但我不理解“备用目录”的概念,也找不到说明:
在命令中使用冒号 ( )的示例cd
。
答案1
该变量默认情况下没有设置(至少在我熟悉的系统中)但是能设置为使用不同的目录来搜索您给出的目标目录cd
。用一个例子可能更容易说明这一点:
$ echo $CDPATH ## CDPATH is not set
$ cd etc ## fails: there is no "etc" directory here
bash: cd: etc: No such file or directory
$ CDPATH="/" ##CDPATH is now set to /
$ cd etc ## This now moves us to /etc
/etc
换句话说,默认行为cd foo
是“移入名为“foo”的目录,该目录是当前目录的子目录或者CDPATH 中给定的任何其他目录的目录”。CDPATH
未设置时,cd
只会在当前目录中查找,但设置后,它还会在您设置的任何目录中查找匹配项。
冒号不与 一起使用cd
,它用于分隔要在 中设置的目录CDPATH
:
CDPATH="/path/to/dir1:/path/to/dir2:/path/to/dirN"
答案2
手册中,CDPATH
是这样描述的:
cd 命令的搜索路径。这是一个以冒号分隔的目录列表,shell 在其中查找 cd 命令指定的目标目录。示例值为“.:~:/usr”。
为了完整起见,这里有一些类似于 特登的。
$~> mkdir /tmp/2 ./2 ./3
$~> cd 2
$~/2> cd ..
$~> CDPATH=/tmp
$~> cd 2
/tmp/2
$~> cd ~
$~> cd 3
$~/3>
正如您所看到的,设置后CDPATH=/tmp
,Bash/tmp
首先查找可能的目标目录。如果在 中找不到/tmp
,它会尝试在当前目录中查找。我们还可以注意到(壳牌内置函数)
如果使用 CDPATH 中的非空目录名,或者如果 - 是第一个参数,并且目录更改成功,则新工作目录的绝对路径名将写入标准输出。
我还想分享这个:
$~> CDPATH=.:/tmp
$~> cd 2
/home/myuser/2
$~/2> cd 2
/tmp/2
在此延续中,CDPATH
给出了两个目录。第一个是.
,即当前目录。由于它先出现,在尝试后cd 2
,我们会到达/home/myuser/2
,尽管/tmp/2
也存在。就像$PATH
,首先列出的目录优先。
答案3
其他答案解释了 CDPATH 的基本用法,但我认为特定的用例是说明性的。通常,我发现我想从同一个根目录开始,在一系列子目录中重复执行某个操作。
cd ~/wrk
for d in */.git/hooks/; do
( cd "$d" && mv pre-commit pre-commit.off )
done
子 shell 是必要的,以便每次迭代都从同一根开始。或者是吗?我们可以在这里避免重复子shell吗?我们可以!
cd ~/wrk &&
CDPATH=$PWD
for d in */.git/hooks; do
cd "$d" && mv pre-commit pre-commit.off
done
这样做还有一个额外的好处,就是 cd 会告诉我们每一步的进展情况。
那么替代目录名称又如何呢?我觉得卡西莫多的例子特别好。如果.
不在您的 CDPATH 中,则您的 CDPATH 优先。但如果您想确保前面的目录优先,您的 CDPATH 应该以.
.