CDPATH 中 cd 命令的“替代目录名称”是什么?

CDPATH 中 cd 命令的“替代目录名称”是什么?

在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 应该以..

相关内容