[英]Location of cd executable
我了解到,使用exec()调用发出的命令的可执行文件应该存储在PATH变量一部分中的目录中。
因此,我在/ bin中找到了ls, chmod, grep, cat
的可执行文件。
但是,我找不到cd
的可执行文件。
它在哪里?
进程只能影响其自己的工作目录。 当可执行文件由外壳执行时,它将作为子进程执行,因此cd可执行文件(如果存在)将在不影响父进程(外壳)的情况下更改该子进程的工作目录,因此cd命令必须实现为内置的shell,实际上在shell自己的进程中执行。
不幸的是,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"
实际上,并非所有可以在shell提示符下执行的实用程序都需要作为实际的可执行文件存在于文件系统中。 它们也可以是所谓的shell内置程序 ,这意味着-您猜到了-它们内置在shell中。
通常,《单一Unix规范》 没有指定是否必须将实用程序作为可执行文件或内置程序提供,而将其作为私有内部实现细节留给OS供应商。
唯一例外的是所谓的特殊的内置插件 ,它必须作为内置插件来提供,因为它们影响的方式shell 本身的行为,经常可执行文件(甚至是普通的内置插件)不能(对示例set
,它设置即使在set
退出后仍保留的变量。 这些特殊的内置功能包括:
break
:
continue
.
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset
请注意, cd
不在该列表中,这意味着cd
不是特殊的内置文件。 实际上, 根据规范 ,将cd
实现为常规可执行文件是完全合法的。 由于其他答案给出的原因,这是不可能的。
并且,如果您向下滚动到规范的非规范部分,即滚动到不是规范的正式部分,而只是纯参考性的部分,您会发现明确提到的事实:
由于cd影响当前的shell执行环境,因此它始终作为常规的常规shell提供。
因此,规范不要求cd
是内置的,但否则根本不可能做到。
请注意,有时实用程序提供了两种方式内置并作为一个可执行文件。 一个很好的例子是time
实用程序,它在典型的GNU系统上既作为Coreutils包的可执行文件提供,又作为Bash内置的shell常规程序提供。 这可能会导致混乱,因为当你这样做man time
,你得到的手册页time
可执行文件( time
内建在记录man builtins
),但是当你执行time
你的time
内建,不支持与您刚刚阅读其手册页的time
可执行文件具有相同的功能。 您必须显式运行/usr/bin/time
(或将Coreutils安装到的任何路径)以获取可执行文件。
根据这个 , cd
总是一个内置的命令, 从来没有一个可执行文件:
由于cd影响当前的shell执行环境,因此它总是作为shell常规内置文件提供。
cd
是外壳的一部分; 内部命令。 没有二进制文件。
命令cd内置在命令行外壳中。 否则,它不会影响您外壳程序的工作目录。
我还搜索了“ cd”的可执行文件,没有这样的文件。 您可以在C中使用chdir(路径名),其效果相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.