为什么 Bash 无处不在(在大多数 Linux 发行版中)?

hoj*_*oju 51 linux bash shell

在我尝试过的每个 Linux 发行版中,默认情况下都使用 Bash,而不是像Z shell (zsh)这样的替代品。这有技术或历史原因吗?

Nor*_*sey 108

历史(不是通过研究获得的,而是通过花费太多时间与贝尔实验室的人一起闲逛获得的):

  1. 一开始(如果你认为开始是 Unix 版本 7)是 Bourne shell。Steve Bourne 是第一个表明控制用户交互的外壳可以是用户程序而不是操作系统的特殊部分的人。历史性突破。shell 本身对于脚本编写来说相对干净,但没有命令行编辑或作业控制。Bourne 的Unix Shell 简介对今天的初学者仍然有用。

    编辑:我忽略了同样来自 Multics 的 Ken Thompson 和 John Mashey 的一些“史前史”。我确信 Bourne 知道所有这些工作(他在同一个实验室,1127,在贝尔实验室),但 Bourne 的外壳是确定的,而且早期的工作几乎没有影响,除非由 Steve Bourne 解释。比如,虽然Ken后来写了Plan 9 C编译器,对Plan 9影响很大,但是Tom Duff关于Plan 9 shell(rc)的论文只提到了Bourne的shell,没有提到Thompson的shell。

  2. shell 只是一个用户程序,所以任何人都可以编写一个。当第 7 版 Unix 在新泽西州创建时,伯克利 Unix 正在加利福尼亚州创建。伯克利的 Bill Joy 写csh了 C shell。Joy 添加了作业控制和历史记录,以及后来的命令行编辑,但不知道 Bourne 的工作,因此他的语言基于 Thompson shell(我在上一个项目符号中认为它是“史前的”)。Unix 社区喜欢工作控制,但他们也喜欢 Bourne 的语言。对于针对 csh 语言的不是特别好的论战,请参阅Csh 编程被认为有害。一时间,许多人使用csh交互方式来实现其作业控制和历史功能,但使用 Bournesh编写脚本。这种情况并不理想。

    编辑:感谢 DigitalRoss 为我整理了csh. 因为我是从那些将 BSD 称为“伯克利异端”的人那里接受教育的,所以我对那里的事实非常缺乏。

  3. 贝尔实验室的 Dave Korn 对 Bourne shell 进行了出色的重新设计,以生产 Korn shell (ksh)。它与 Bourne shell 完全向后兼容,sh但提供了大量宝贵的改进。 ksh成为 POSIX 标准的基础,并随 Sun 软件一起提供。(尽管 Bill Joy 离开伯克利帮助创建了 Sun 并且是他们领先的软件人员之一。)

  4. 贝尔实验室和 AT&T 愚蠢地未能ksh开源。ksh88被广泛使用,但拥有来源是不合法的。某些人变得如此上瘾,以至于他们成为数字罪犯。

    编辑:这真的很愚蠢吗?很难知道。伯克利已经放弃了 Unix,其他公司也很快跟进,但这仍然是企业大师相信 Unix 收费的时代。但结果是:AT&T Unix 在被多次出售给各方之后已经死了。BSD 及其衍生产品还很活跃,但这些被称为“Linux”和“GNU”的新贵事物拥有曾经属于贝尔实验室的很大一部分思想份额。

  5. 自由软件基金会做了一个“洁净室”,从头开始实现 POSIX shell,将 Dave Korn 的所有想法作为当前的想法,加上通常的 FSF 风格添加他们自己的新功能,例如可编程完成。他们称它为“Bourne again”外壳,或bash.

  6. 在 1990 年代中期 AT&T 开源ksh93,但到那时广泛采用为时已晚。许可协议非常不标准。 bashksh发散,ksh从来没有达到与其历史地位相称的市场份额。

课程:

  • 第一个合适的产品推向市场获胜(sh)。

  • 人们喜欢新功能(作业控制、命令完成),但当他们的旧脚本继续工作时,他们会更喜欢它们。

  • 编辑:工程学教授应该把历史留给科学史学家:-)

  • 我可能没有很好地解释这一点,让我再试一次。Csh *早于 Bourne*,或者最迟是一个大洲之外的并行实现。(在互联网出现之前,这很重要。)我在 Cory Hall 坐在 Bill Joy 旁边,偶尔,当他写这本书的时候;我绝对可以向你保证他是在 V6 上写的。正如我所说,csh(和 Bourne)是 V6-Thompson 向后兼容的,因为这就是他们编写它们时存在的全部内容。当然,这与 Bourne 不兼容,AFAIK Bill Joy 的才能不包括看到未来 (3认同)
  • 没有特别责怪诺曼,这里有很多不准确之处。Ken Thompson 编写了第一个 shell,这是唯一一个通过 V6 的 shell,并在 V7 和 32V 中并行使用。Stephen Bourne 不是“第一个”shell 编写者,他重写了 KT shell。Csh 在 4.1BSD 之前没有作业控制,尽管它是第一个获得它的 shell。Csh 没有改变任何 shell 语法,它向后兼容 V6 shell,就像 Bourne shell 一样。那时几乎所有的代码都获得了许可。向 Unix 收取许可费到底有什么愚蠢之处? (2认同)
  • `bash` 不是从 `tcsh` 中汲取了可编程完成的想法吗? (2认同)

Dig*_*oss 46

Bash 有两个完全不同的目标。

  1. 这是一个很好的壳。它可能是将历史替换csh等一些很酷的功能集成!到 posix 语法中的两个 shell 之一(另一个是 zsh)。它有很多扩展,包括数组。

  2. 它是 FSF/GNU shell。在开源世界中,这给了它一种声望。

我还应该补充一点,它并不总是默认值。ash通常用作 /bin/sh 以便虽然bash可能是交互式 shell,但ash它是“只运行命令文件”的 shell。这是因为ash它更小更快,并且包含 posix 特征,所以它是一个适当的子集。使用ash作为一个交互式shell有时是有问题的。例如,在 NetBSD 上,它运行良好,因为它内置了所有功能。这是他们的一个外壳,而它bash是一个外部包。但是在 Linuxash上通常被认为是非交互式的,因此他们在没有历史记录和没有(重要的)行编辑的情况下编译它,理论上它只是用来运行那些巨大的gnu configure脚本。

两个贝壳的故事

贝壳的真实历史

更新:在网络上从一个地方到另一个地方复制外壳的历史不准确,人们相信它是可以理解的。我将尝试提供一个准确的版本,并在此处提供一些链接来证实它。

  1. 第一个 shell 肯定不是 Bourne shell,而是由 Ken Thompson 自己编写并以 V6 分发,这是 AT&T 发送给各大学和政府实验室的版本。这就是将 Unix 放在地图上的原因。它具有所有的基础知识,<, >, >>, |, &但它只是goto通过一个在标准输入上寻找的外部程序具有简单的控制语法。那时还没有复杂的 shell 脚本。后来的 shell 将在单独的 fd 上打开命令输入。今天看起来可能很简单,但在 1970 年代计算的恐怖电影中,它是世界上最好的东西。信不信由你,这个古老的贝壳今天有自己的推特流,当然还有主页
  2. 所述第二壳体csh 写(象vi)由比尔乔伊在UCB。这是在 GNU readline 和 NetBSD editline 之前,所以用!语法做历史似乎是完全合理的。Csh 添加了当今的大部分 shell 功能,但使用了 csh 语法。csh 没有改变任何语法,无偿或以其他方式。它实际上向后兼容 Thompson shell,并且最初包含 TS 源代码。
  3. 第三个 shell 是 Bourne shell,具有不同的语法。UCB 和 AT&T 正在并行开发 Unix。这个外壳有一个奇怪的内存分配器(我认为它只是使用更多的内存,被困SIGSEGV,做了一个新的BRK(2),然后再次尝试过),使得它很难在新的Unix端口上运行,所以oshcsh留下流行了一段时间. 没有互联网并且它获得了软件许可,所以在那种环境中,斯蒂芬·伯恩可能不知道乔伊的外壳,乔伊当然也不知道伯恩。当 UCB 获得 VAX 和现已被遗忘的 Unix/32V的预发行版时,这两种 shell 可能第一次相遇。我记得比尔抱怨内存分配。请注意,这两个 shell 都向后兼容 V6 shell,他们只是在不同的方向扩展了语法。
  4. 现在确实有多个不兼容的 shell,AT&T 添加了 Bourne 兼容的ksh. 最终,csh有半可用的源代码,但它被捆绑在 AT&T 和加州大学之间诉讼中。尽管如此,这些仍然是 BSD Unix 的辉煌岁月,因为能够负担 50,000 美元费用的成熟公司会购买 AT&T 许可证但安装 4.x BSD 发行版,而大学则免费获得它。
  5. 在这种存在许多法律和技术问题的情况下,进行了各种独立的实施。至少csh与 Bourne shell 语法一样多,有些人将两者合并。你有至少tcshzshbash,和ash。Bourne 语法是“官方的”,是 AT&T 版本的一部分,但在那些日子里,BSD 非常重要,而 Sun(最初是 BSD)分发了大量世界上遇到的 Unix SW。
  6. 部分是因为 USL 诉讼,FSF 和 Linux 有一个开放的领域。与此同时,AT&T 设法与地球上为数不多的比他们大的实体之一(加利福尼亚州)进行了一场斗争,最终他们没有赢得诉讼,因此最终 BSD 发行版是合法的立足点。但那时 Linux 和 bash 无处不在,所以今天 BSD 是一个小众市场。
  7. 最后,bash 是一个很好的 shell(虽然显然它的原作者私下否认了它)并且它的成功完全值得称赞。即使 ash、bash 和 ksh 没有赢得语法大战,csh 也会被 tcsh 和 zsh 黯然失色。

  • 我想说的很清楚,我的回答是我的原创作品;没有任何文字被*复制*。 (2认同)

dpb*_*dpb 6

添加@DigitalRoss所说的内容

  • Bash 是 posix-sh 的完整超集替代品,即使被称为 /bin/sh 也会完全模拟 posix-sh。Posix-sh 是商业 unix 系统作为公分母 shell 的“标准”。因此,从那里开始并以此为基础的东西从很多开始。