linux - 为什么有些 Bash 命令既是内置命令又是外部命令?

标签 linux bash shell terminal

一些命令是内部内置的 Bash 命令,而另一些是外部的(其他程序)。我明白为什么某些命令需要内置。一些原因是:

  1. 如果一个命令需要改变shell进程的内部状态。
  2. 如果命令在 shell 中执行非常基本的操作。
  3. 如果经常调用命令并且需要快速执行。外部命令是通过加载外部程序来执行的,因此速度较慢。

但是为什么有些命令既是内置的又是外部的,例如 echo test ?我知道 echo 被广泛使用,因此是内置的(原因 3)。但是为什么还要将它作为一个外部命令并在 /bin/echo 中为它提供一个二进制文件呢? echo 的内置版本将始终优先于外部版本,因​​此很少使用外部版本。那么,为什么要有它的外部版本呢?

最佳答案

这正是您的观点 3. 当命令执行的操作很少时(echo 是一个很好的例子),生成一个新进程将主导运行时行为。随着磁盘、带宽和代码库的增长,当您拥有如此多的数据和如此多的文件(我们工作中的代码库有 10 万个文件!!)时,您总是会遇到这样的情况,以至于每个文件少生成一个文件会造成几分钟的差异。

这也是为什么典型的内置函数是一个直接替代品,它采用与二进制文件相同的参数(可能是其超集)。

您还问为什么旧的二进制文件仍然保留,即使 Bash 将它作为内置程序 — 答案是很多程序都依赖于 /bin/echo 的存在。实际上是 standardized .

Bash 只是众多用户界面和离线命令解释器中的一种。它们都有不同的内置插件集。有些 shell 故意很小,并且在很大程度上依赖于您所谓的“遗留”二进制文件。一个例子是 ash及其继任者 Dash .由于速度快,Dash 现在是 Ubuntu 和 Debian 中的默认 /bin/sh,并且由于体积小而在嵌入式系统中很受欢迎。 (但即使是 Dash 也内置了 echotest 和许多其他命令,并提供了交互式使用的命令历史记录。)

关于linux - 为什么有些 Bash 命令既是内置命令又是外部命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53364895/

相关文章:

linux - Bash 中的全局函数?

python - Python Shell(Google App)有问题吗?

python - 使用 shell=True w/list 时忽略 subprocess.call() 参数

python - linux 目录权限检查和/或 dir 是否存在

linux - Bash:使用字符串变量一个接一个地运行命令

linux - 查找带有重音字符的 unix 文件

macos - 在 OSX 上将 shell 从 Bash 更改为 Zsh 时找不到 Java_HOME?

linux - sed - 在匹配后的 X 行后插入行

ruby-on-rails - centos上安装resque Brain时出错

linux - EUID 和 UID 之间的区别?