cd可执行文件的位置

我读过使用exec()调用发出的命令的可执行文件应该被存储在PATHvariables的一部分的目录中。

因此,我在/ bin中find了ls, chmod, grep, cat的可执行文件。

但是,我无法findcd的可执行文件。

它在哪里?

一个进程只能影响自己的工作目录。 当一个可执行文件被shell执行时,它作为一个子进程来执行,所以一个cd可执行文件(如果存在的话)会改变这个子进程的工作目录而不影响父进程(shell),因此cd命令必须作为内置的shell实际上是在shell自己的进程中执行的。

cd是一个内置的外壳,不幸的是。

 $ type cd cd is a shell builtin 

…来自http://www.linuxquestions.org/questions/linux-newbie-8/whereis-cd-sudo-doesnt-find-cd-464767/

但是你应该能够使用它:

 sh -c "cd /somedir; do something" 

并非所有可以在shell提示符下执行的实用程序实际上都需要作为文件系统中的实际可执行文件存在。 它们也可以是所谓的外壳内置 ,也就是说 – 你猜对了 – 它们是内置的。

单一的Unix规范通常不会指定一个实用程序是作为一个可执行文件还是作为一个内置的提供的,这个作为一个私有的内部实现细节留给操作系统供应商。

唯一的例外是所谓的特殊内置插件 ,它必须作为内置插件来提供,因为它们影响外壳本身的行为,使得普通的可执行文件(甚至是普通的内置插件)不能示例set ,它设置即使set退出后仍然存在的变量)。 这些特殊的插件是:

  • break
  • :
  • continue
  • .
  • eval
  • exec
  • exit
  • export
  • readonly
  • return
  • set
  • shift
  • times
  • trap
  • unset

请注意, cd 不在该列表中,这意味着cd不是一个特殊的内置。 实际上, 根据规范 ,将cd作为常规可执行文件来执行是完全合法的。 这是不可能的,由于其他答案给出的原因。

如果您向下滚动到规范的非规范部分,也就是说不属于规范的部分,只是纯粹的信息性部分,您会发现明确提到的事实:

由于cd会影响当前的shell执行环境,因此它总是以常规的内置shell的形式提供。

因此,规范并不要求cd是一个内置的,但是这是不可能的。

请注意,有时候,实用程序将以内置可执行形式提供。 time效用就是一个很好的例子,在一个典型的GNU系统上,这个time效用既可以作为Coreutils包的可执行文件,也可以作为Bash内置的shell来提供。 这可能会导致混淆,因为当你做man time ,你会得到可执行time的manpage(内置的time被记录在man builtins ),但是当你执行的time你得到了内置的time ,这不支持与刚刚阅读的time可执行文件相同的功能。 您必须显式运行/usr/bin/time (或者您安装Coreutils的任何路径)来获取可执行文件。

据此, cd总是一个内置的命令, 从来没有一个可执行文件:

由于cd会影响当前的shell执行环境,因此它总是以常规的内置shell的形式提供。

cd是shell的一部分; 一个内部命令。 没有二进制。

命令cd是内置在命令行shell中的。 否则它不会影响你的shell的工作目录。

我也搜查了“cd”的可执行文件,并没有这样的。 您可以在C中使用chdir(pathname),它具有相同的效果。