我读到使用exec()调用发出的命令的可执行文件应该存储在属于PATH变量的目录中。
因此,我在/ bin。
中找到了ls, chmod, grep, cat
的可执行文件
但是,我找不到cd
的可执行文件。
它位于哪里?
答案 0 :(得分:21)
进程只能影响自己的工作目录。当shell执行可执行文件时它作为子进程执行,因此cd可执行文件(如果存在)将更改该子进程的工作目录而不影响父进程(shell),因此cd命令必须实现为shell内置实际上在shell自己的进程中执行。
答案 1 :(得分:7)
cd是一个内置的shell。
$ 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"
答案 2 :(得分:7)
并非所有可以在shell提示符下执行的实用程序实际上都必须作为文件系统中的实际可执行文件存在。它们也可以是所谓的 shell内置函数,这意味着 - 你猜对了 - 它们是内置在shell中的。
单Unix规范通常会不指定是否必须将实用程序作为可执行文件提供或作为内置提供,这是作为操作系统的私有内部实现细节而保留的的供应商。
唯一的例外是所谓的special built-ins,其中必须作为内置函数提供,因为它们会影响shell 本身的行为常规可执行文件(甚至常规内置函数)不能的方式(例如set
,它设置即使在set
退出后仍然存在的变量。那些特殊的内置插件是:
break
:
continue
.
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset
请注意,cd
在该列表中不,这意味着cd
不是特殊的内置版本。实际上,according to the specification,将cd
实现为常规可执行文件是完全合法的。由于其他答案给出的原因,这是不可能的。
如果你向下滚动到规范的非规范部分,即那些不是规范的正式部分但只是纯信息的部分,你会发现明确提到的事实:
由于cd会影响当前的shell执行环境,因此它始终作为 shell常规内置提供。
因此,规范不要求cd
是内置的,但是根本不可能这样做。
请注意,有时会将实用程序作为内置和提供为可执行文件。一个很好的例子是time
实用程序,它在典型的GNU系统上既可以作为Coreutils包的可执行文件,也可以作为Bash内置的shell常规提供。这可能会导致混淆,因为当您执行man time
时,您会获得time
可执行文件的联机帮助页(time
内置man builtins
),但执行时time
您获得了内置的time
,它不支持与您刚阅读的联机帮助页time
可执行文件相同的功能。您必须显式运行/usr/bin/time
(或安装Coreutils的任何路径)才能获取可执行文件。
答案 3 :(得分:2)
根据this,cd
始终是内置命令,从不可执行文件:
由于cd会影响当前的shell执行环境,因此它始终作为常规内置shell提供。
答案 4 :(得分:2)
cd
是shell的一部分;内部命令。它没有二进制文件。
答案 5 :(得分:2)
命令cd内置在命令行shell中。否则它不会影响shell的工作目录。
答案 6 :(得分:0)
我还搜索了“cd”的可执行文件,但没有这样的。 你可以在C中使用chdir(pathname),它具有相同的效果。