【问题标题】:Why are some Bash commands both built-in and external?为什么有些 Bash 命令既是内置的又是外置的?
【发布时间】:2018-11-18 20:01:18
【问题描述】:

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

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

但是为什么有些命令既是内置的又是外置的,例如echotest?我知道 echo 被大量使用,因此是内置的(原因 3)。但是为什么还要将它作为一个外部命令并在 /bin/echo 中有一个二进制文件呢? echo 的内置版本总是优先于外部版本,因​​此外部版本几乎不会被使用。那么,为什么还要有它的外部版本呢?

【问题讨论】:

  • 还要考虑bash 不是唯一的外壳。在其历史的某个时刻bash 可能已经决定在内部创建一个命令,例如原因 #3 - 但仍有其他 shell 调用该工具,因此它必须作为外部命令继续存在。

标签: linux bash shell terminal


【解决方案1】:

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

这也是为什么典型的内置是一个插入式替换,它采用与二进制相同的参数(可能是超集)。

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

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

【讨论】:

  • 但是为什么不把它仅仅作为一个内部命令,比如 cd 呢?将其设为外部的目的是什么?
  • Fedora(和 RHEL?)确实有一个外部 /bin/cd 脚本,它简单地调用 /bin/sh 内置 cd 命令。据我所知,它的唯一目的是检查“cd”命令是否会成功,而无需实际更改当前 shell 中的目录。
  • 嘿@PeterMortensen,感谢您的编辑——我想它(略微)改进了答案。但出于好奇:您是否经常查看旧答案并加以改进?
猜你喜欢
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多