我读到使用exec()调用发出的命令的可执行文件应该存储在属于PATH变量的目录中.
因此,我找到了ls, chmod, grep, cat/ bin中的可执行文件.
但是,我找不到可执行文件cd.
它在哪里?
Lau*_*ves 21
进程只能影响自己的工作目录.当shell执行可执行文件时它作为子进程执行,因此cd可执行文件(如果存在)将更改该子进程的工作目录而不影响父进程(shell),因此cd命令必须实现为shell内置实际上在shell自己的进程中执行.
不幸的是,cd是一个内置的shell.
$ type cd
cd is a shell builtin
Run Code Online (Sandbox Code Playgroud)
...来自http://www.linuxquestions.org/questions/linux-newbie-8/whereis-cd-sudo-doesnt-find-cd-464767/
但你应该能够使用它:
sh -c "cd /somedir; do something"
Run Code Online (Sandbox Code Playgroud)
并非所有可以在shell提示符下执行的实用程序实际上都必须作为文件系统中的实际可执行文件存在.它们也可以是所谓的shell内置函数,这意味着 - 你猜对了 - 它们是内置在shell中的.
通常,单Unix规范不会指定是否必须将实用程序作为可执行文件或内置实用程序提供,而是将其作为私有内部实现细节提供给OS供应商.
唯一的例外是所谓的特殊内置函数,它必须作为内置函数提供,因为它们以常规可执行文件(甚至常规内置函数)不能的方式影响shell 本身的行为(对于例如set,它设置即使在set退出后仍然存在的变量).那些特殊的内置插件是:
break:continue.evalexecexitexportreadonlyreturnsetshifttimestrapunset请注意,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的任何路径)才能获取可执行文件.
| 归档时间: |
|
| 查看次数: |
6855 次 |
| 最近记录: |