可能的重复:
为什么 cd 不是一个程序?
我注意到其他所有常用的 util(例如ls, cp, rm
等)实际上都是 /bin 中的文件——但cd
事实并非如此。它也不在任何其他二进制文件目录中(例如/usr/bin, /bin, /sbin
等)。
为什么会这样?
答案1
cd
是一个外壳内置。所以它是 shell 本身的一部分,而不是单独的可执行文件。
基本上有两类内置函数。
- 特殊内置函数与 shell 紧密相连,要么不能独立实现,要么不能,因为这样做没有功能意义(它们主要与 shell 控制有关)。它们被称为“特殊”,因为它们有特定的错误处理和变量赋值语义。
- 常规内置函数通常出于性能原因在 shell 中实现,因为它们操纵 shell 内部结构(例如
cd
)或者因为这样在技术上更容易。在某些情况下,常规内置也可能以非内置形式存在。后一种情况的一个例子是echo
,它在每个现代 shell 中实现,但主要由于历史原因也存在,如/bin/echo
。
内置关键功能的另一个原因是,即使您的系统发生灾难性的情况,它也可以确保核心功能继续保持可访问性。例如,如果共享库损坏或无法访问,如果您失去了对/bin
或 的访问权限/sbin
,或者系统因资源限制而不允许运行更多可执行文件,则这一点可能很重要。
答案2
一些 Unix 历史资源说 cd曾是Unix 开发的某个(相当早期)时期的外部命令。这是一个特殊的命令,可以修改父母当前目录。
您可以从以下事实中看到这种历史状态的雏形:Solaris有/usr/bin/cd 作为一个真正的命令,除了 shell 内置命令之外。但我不确定它在当前系统中是否有任何实际作用。
这作为外部命令是一个临时解决方案,一旦 Unix 开发人员能够拥有 shell 内置命令,该解决方案就被消除了。在简单的系统调用就足够的地方拥有一个完整的命令(应该有自己的进程,从磁盘加载等)太昂贵了。所以它成为了一个内置函数,并且从那时起,它的状态就没有改变过。
人们可以创建一个 shell,其中几乎可以内置任何命令;这只是一种设计权衡。例如,CP这里提到的可能是这个的很好的候选者;这种内置功能已在 MS-DOS 的一些 shell 中实现。但是,在 Unix 中,进程创建和启动更便宜,并且不需要在内部发明功能,除非它无法从另一个进程实现。这包括光盘,极限值,出口、变量操作、控制流命令(如果,为了,尽管等)等等。