正如中所引用的这个很好的答案cd
,POSIX 系统除了内置的 shell 之外还有一个外部二进制文件。在 OS X 10.8 上它是/usr/bin/cd
.您不能像内置程序一样使用它,cd
因为它在更改自己的工作目录后立即退出。它有什么目的?
答案1
它主要用于确保 POSIX 工具箱在 shell 内部和外部都可用(请参阅POSIX 要求这些的理由)。
对于cd
,这并不是很有用,但请注意,cd
更改目录会产生其他副作用:它返回一个退出状态,帮助确定您是否能够chdir()
访问该目录,并输出一条有用的错误消息,解释为什么不能访问该目录chdir()
当你不能的时候。
例子:
dirs_i_am_able_to_cd_into=$(find . -type d -exec cd {} \; -print)
另一个潜在的副作用是目录的自动挂载。
在一些系统上,标准 shell 内置命令的大多数外部命令都是作为同一脚本的符号链接来实现的:
#! /bin/sh -
"${0##*/}" "$@"
那就是启动一个 shell 并运行其中的内置命令。
其他一些系统(如 GNU)将实用程序作为真正的可执行命令,当行为与 shell 内置版本不同时,可能会导致混乱。
答案2
非内置 cd 命令可用的事实本质上是由于 POSIX要求对于所有常规内置命令都可以通过 exec 系列命令、、、、env
以及组合起来,其中一些命令本身并未作为内置命令实现。find
nice
nohup
time
xargs
但这没有多大意义,因为cd
将它与这些命令结合起来是毫无意义的。不过,这里有或多或少站得住脚的例子:
find . -type d -exec cd {} \;
env HOME=/foo cd
答案3
除了检查路径是否对应于可访问目录之外,cd
可执行文件还将处理和使用该CDPATH
变量,并且将打印出来如果成功使用,则为已解析目录的绝对路径。
$ export CDPATH=/usr
$ echo bin lib | xargs -n 1 cd
/usr/bin
/usr/lib
这只是偶尔有用,但可以节省重新实现用于搜索匹配目录的相同逻辑。一个具体的用例是在几个可能的父目录下查找特定名称的第一个现有目录。
cd
也处理OLDPWD
,cd -
但这不太具体有用,因为环境变量已经可用。