我对内置shell的定义有点困惑.根据Bash参考手册,对于任何内置,shell直接执行命令,而不调用另一个程序."命令直接执行"究竟意味着什么?例如,让我们看一下cd内置的:
$ which cd
/usr/bin/cd
$ type cd
cd is a shell builtin
Run Code Online (Sandbox Code Playgroud)
现在,让我们看看非内置grep:
$ which grep
/usr/bin/grep
$ type grep
grep is /usr/bin/grep
Run Code Online (Sandbox Code Playgroud)
它似乎cd是一个单独的二进制文件.如何执行cd(或任何其他内置)与执行grep(或任何其他非内置)不同?
有些命令既作为内置函数存在于shell中,也作为单独的程序存在.该which命令(这是一个单独的程序,而不是一个内置的!)只能找到单独的程序,并且永远不会与内建打扰.尝试type readarray并which readarray查看仅作为内置函数存在的命令会发生什么.
重要的是要注意内置版本和外部程序可能有很大不同.在某些情况下,您可能更喜欢依赖内置(即如果您知道将使用哪个shell脚本,但不确定将执行哪个确切的外部版本),或者反过来.
您可以使用其完整路径调用外部程序(这将绕过内置程序).
当调用外部程序时,操作系统将启动一个单独的进程,而内置程序是shell程序本身的一部分,因此将具有更低的开销.在许多情况下,这种开销是微不足道的,但如果您要多次执行该命令,则可能会对脚本的性能产生重大影响.