我读过使用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),它具有相同的效果。