koj*_*iro 81 cd-command posix command
正如在这个很好的答案中所提到的,POSIX 系统cd
除了内置的 shell 之外还有一个外部二进制文件。在 OS X 10.8 上,它是/usr/bin/cd
. 您不能像内置函数那样使用它,cd
因为它在更改自己的工作目录后立即退出。它的目的是什么?
Sté*_*las 73
它主要用于确保 POSIX 工具箱在 shell 内部和外部都可用(请参阅POSIX 基本原理以了解要求)。
对于cd
,这不是很有用,但请注意,cd
更改目录但有其他副作用:它返回一个退出状态,帮助确定您是否能够chdir()
访问该目录,并输出一条有用的错误消息,解释您为什么不能访问chdir()
当你不能。
例子:
dirs_i_am_able_to_cd_into=$(find . -type d -exec cd {} \; -print)
Run Code Online (Sandbox Code Playgroud)
另一个潜在的副作用是目录的自动挂载。
在一些系统上,标准 shell 内置命令的大多数外部命令都是作为符号链接实现的,该脚本执行以下操作:
#! /bin/sh -
"${0##*/}" "$@"
Run Code Online (Sandbox Code Playgroud)
那就是启动一个shell并在其中运行内置函数。
其他一些系统(如 GNU)将实用程序作为真正的可执行命令,当行为与 shell 内置版本不同时,可能会导致混淆。
jll*_*gre 12
非内置 cd 命令可用的事实本质上是由于 POSIX要求所有常规内置命令都可以由 exec 系列命令调用env
,find
, nice
, nohup
,time
并xargs
结合这些命令中的一些命令本身没有作为内置命令实现。
这没有多大意义,cd
因为将它与这些命令结合起来毫无意义。不过,这里有或多或少站得住脚的例子:
find . -type d -exec cd {} \;
env HOME=/foo cd
Run Code Online (Sandbox Code Playgroud)