`cd` 外部命令有什么意义?

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 内置版本不同时,可能会导致混淆。

  • +1 用于观察副作用和错误消息。对于新用户来说,Unix 中的许多聪明的习语都来自于对副作用的谨慎使用,这一点并不总是得到很好的解释。而且手册页本身从来都不擅长描述更大的图景。 (4认同)
  • @ffledgling,请参阅 https://en.wikipedia.org/wiki/Automounter (2认同)
  • 稍微解释一下 Stéphane Chazelas 的想法:如果您需要确保一个自动目录实际上已挂载而不对其进行任何更改并且不尝试读取任何文件,则可以使用外部 `cd` 命令。可能在监视可自动挂载的远程文件系统的可用性时有用,或者可能在使用某个时间关键的文件系统之前进行。 (2认同)

jll*_*gre 12

非内置 cd 命令可用的事实本质上是由于 POSIX要求所有常规内置命令都可以由 exec 系列命令调用envfind, nice, nohup,timexargs结合这些命令中的一些命令本身没有作为内置命令实现。

这没有多大意义,cd因为将它与这些命令结合起来毫无意义。不过,这里有或多或少站得住脚的例子:

find . -type d -exec cd {} \;
env HOME=/foo cd
Run Code Online (Sandbox Code Playgroud)

  • @Kevin 我写的这是所有 **regular builtins** 的要求,豁免的是 **special builtins**:`break, :, continue, . 、eval、exec、exit、export、readonly、return、set、shift、times、trap、unset` 将与外部命令无关,而 `cd` 是一个常规的内置命令,它有一些记录在案的用例作为命令。 (5认同)
  • 许多内置插件实际上是[免于该规则](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_14)。奇怪的是, cd 不是其中之一。 (2认同)