cd外部命令的作用是什么?


71

正如这个好答案所提到的,POSIX系统cd除了内置shell 外还具有一个外部二进制文件。在OS X 10.8上为/usr/bin/cd。您不能像内置函数那样使用它,cd因为它会在更改其自己的工作目录后立即退出。它有什么作用?


请注意,Ubuntu和CentOS(因此可能是Red Hat)没有/usr/bin/cd,只有内置的shell。
基思·汤普森

1
我的Fedora 19包括了/bin/cd
slm

1
Debian(我检查了多个发行版,包括当前的测试)既没有,/bin/cd也没有/usr/bin/cd
derobert

1
我想这使得这些系统并不是严格意义上的POSIX。就像其他人一样。:)
kojiro 2014年

Answers:


64

它主要是用来确保POSIX工具箱在外壳的内部和外部都可用(请参阅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
+1用于观察副作用和错误消息。对于新用户而言,并非总是很好地解释说,Unix中的许多聪明习惯用法都来自对副作用的谨慎使用。手册页本身从来都不擅长描述大局。
RBerteig 2014年

来自类似SO的问题,您能否详细说明“自动挂载目录”的含义?
刚出生的人


1
为了稍微解压StéphaneChazelas的想法:如果您需要确保实际上安装了一个可自动输出的目录,而无需对其进行任何更改并且不尝试读取任何文件,则可以使用外部cd命令。在监视可自动挂载的远程文件系统的可用性时,或者在对某个文件执行时间紧迫的操作之前,这可能很有用。
telcoM

11

事实上非内置cd命令可基本上是由于POSIX的要求,对所有常规内置命令是由exec命令族调用envfindnicenohuptimexargs结合这样的事实:一些命令没有被自己实现为内建命令。

但这并没有多大意义,cd因为将其与这些命令结合起来是毫无意义的。不过,这里还是有一些成立的例子:

find . -type d -exec cd {} \;
env HOME=/foo cd

2
实际上,许多内置程序不受该规则的限制。奇怪的是,cd不是其中之一。
凯文

5
@Kevin我写的是所有常规内建函数的要求,被豁免的是特殊的内建函数break, :, continue, . , eval, exec, exit, export, readonly, return, set, shift, times, trap, unset与外部命令无关,而cd作为常规内建函数有一些已记录的用例作为命令。
jlliagre

1

除了检查路径是否对应于可访问目录外,cd可执行文件还将处理和使用该CDPATH变量,并且如果成功使用了解析目录,则将打印出解析目录的绝对路径。

$ export CDPATH=/usr
$ echo bin lib | xargs -n 1 cd
/usr/bin
/usr/lib

这只是偶尔偶尔有用,但是可以节省重新实现用于搜索匹配目录的相同逻辑。一个具体的用例是在多个可能的父目录下找到该特定名称的第一个现有目录。

cd也处理OLDPWDcd -,但就是不太具体有用的,因为环境变量将已经可用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.