我对内置shell的定义有点困惑。根据{{3}},对于任何内置的, shell直接执行命令,而不调用另一个程序。究竟是什么意思直接执行"命令"?例如,让我们看一下内置的cd
:
$ which cd
/usr/bin/cd
$ type cd
cd is a shell builtin
现在,让我们看一下非内置grep
:
$ which grep
/usr/bin/grep
$ type grep
grep is /usr/bin/grep
cd
似乎是一个单独的二进制文件。如何执行cd
(或任何其他内置函数)与执行grep
(或任何其他非内置函数)不同?
答案 0 :(得分:5)
某些命令既作为内置函数存在于shell中,也作为单独的程序存在。 which
命令(它是一个单独的程序,而不是内置程序!)只能找到单独的程序,而且永远不会打扰内置程序。尝试使用type readarray
和which readarray
来查看仅作为内置函数存在的命令会发生什么。
重要的是要注意内置版本和外部程序可能有很大不同。在某些情况下,您可能更喜欢依赖内置(即如果您知道脚本将用于哪个shell,但不确定将执行哪个确切的外部版本),或者反过来。
您可以使用其完整路径调用外部程序(这将绕过内置程序)。
当调用外部程序时,操作系统将启动一个单独的进程,而内置程序是shell程序本身的一部分,因此具有更低的开销。在许多情况下,这种开销是微不足道的,但如果您要多次执行该命令,则可能会对脚本的性能产生重大影响。
答案 1 :(得分:2)
除了弗雷德的正确答案:
我理解你对内置命令和外部命令的困惑。 cd
命令实际上很适合进行一些演示。
例如,在我的系统上,情况如下:
$ which cd # gives no output
$ whereis cd # again, no path found
cd:
$ type -a cd # verifies that it's a real builtin command
cd is a shell builtin
这清楚地表明我的机器上没有安装外部程序的cd
命令。在您的情况下,which cd
表示在cd
下安装了额外的/usr/bin/cd
命令(单独的程序)。
当您键入cd
时是否要调用内置命令或外部命令时,有时并不清楚。为了确保您真正调用内置cd
命令,您可以执行以下操作:
$ builtin cd
在内置cd
命令的帮助页面中:
$ help builtin
内置:内置[shell-builtin [arg ...]] 执行shell builtins。
Execute SHELL-BUILTIN with arguments ARGs without performing command lookup. This is useful when you wish to reimplement a shell builtin as a shell function, but need to execute the builtin within the function.
现在您可以看到builtin
命令如何用于强制执行shell内置命令。这在特殊情况下非常有用。
此外,您可以(实际上很明显)期望内置命令 [source]获得更好的性能:
通常,脚本中的外部命令会分离子进程, [*]而Bash内置则没有。出于这个原因,内置执行 更快速地使用比外部更少的系统资源 命令等价物。