Shell内置执行

时间:2017-04-01 16:23:57

标签: bash shell

我对内置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(或任何其他非内置函数)不同?

2 个答案:

答案 0 :(得分:5)

某些命令既作为内置函数存在于shell中,也作为单独的程序存在。 which命令(它是一个单独的程序,而不是内置程序!)只能找到单独的程序,而且永远不会打扰内置程序。尝试使用type readarraywhich 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内置则没有。出于这个原因,内置执行   更快速地使用比外部更少的系统资源   命令等价物。