正如在这个很好的答案中所提到的,POSIX 系统cd除了内置的 shell 之外还有一个外部二进制文件。在 OS X 10.8 上,它是/usr/bin/cd. 您不能像内置函数那样使用它,cd因为它在更改自己的工作目录后立即退出。它的目的是什么?
我编写了一个小 bash 脚本来查看当我继续跟踪指向同一目录的符号链接时会发生什么。我期待它要么创建一个很长的工作目录,要么崩溃。但结果让我大吃一惊...
mkdir a
cd a
ln -s ./. a
for i in `seq 1 1000`
do
cd a
pwd
done
Run Code Online (Sandbox Code Playgroud)
一些输出是
${HOME}/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
${HOME}/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
${HOME}/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
${HOME}/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
${HOME}/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
${HOME}/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
${HOME}/a
${HOME}/a/a
${HOME}/a/a/a
${HOME}/a/a/a/a
${HOME}/a/a/a/a/a
${HOME}/a/a/a/a/a/a
${HOME}/a/a/a/a/a/a/a
${HOME}/a/a/a/a/a/a/a/a
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
我添加了一个符号链接到当前目录ln -s . aa。如果我执行cd aa,然后我执行pwd,响应是/home/sim/aa。
但是如果我执行/bin/pwd它会打印/home/sim(当前目录没有改变)。
这种差异从何而来?
我们知道该cd命令用于更改目录。例如
cd dirname
Run Code Online (Sandbox Code Playgroud)
有效的目录名也包括.和..。目的cd ..很明确。从联机帮助页:
CDPATH 中的空目录名与当前目录相同,即“.”。
但是,这样做的目的是cd .什么?