为什么Bash无处不在(在大多数(如果不是全部)Linux发行版中)?


50

Bash是在每一个Linux发行版我曾尝试使用默认情况下,在类似的替代品的Z shell(zsh中)。是否出于技术或历史原因?


1
不是。在我的FreeBSD系统上,tcsh是默认的shell!

54
您的FreeBSD系统不是Linux发行版。

8
上帝禁止发行之间保持一定的一致性...
OMG Ponies,2009年

4
不,但是它属于“无处不在” :)

Answers:


106

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

  1. 最初(如果您以Unix版本7为起点)是Bourne shell。史蒂夫·伯恩(Steve Bourne)第一个展示控制用户交互的外壳程序可以是用户程序,而不是操作系统的特殊部分。历史性的突破。Shell本身相对来说可以编写脚本,但是没有命令行编辑或作业控制。伯恩(Bourne)的《 Unix Shell入门》仍然对今天的初学者有用。

    编辑:我已经忽略了Ken Thompson和John Mashey(也来自Multics)的一些“史前史”。我确信伯恩(Bourne)知道所有这些工作(他在贝尔实验室(Bell Labs),是在同一实验室,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。Berkeley的Bill Joy编写csh了C shell。乔伊增加了工作控制和历史记录,以及后来的命令行编辑,但是他并不了解伯恩的工作,因此他的语言基于汤普森的外壳(在上一篇文章中我称之为“史前史”)。Unix社区喜欢工作控制,但是他们也喜欢Bourne的语言。有关针对csh语言的争论特别不好的内容,请参阅《认为有害的Csh编程》。一段时间以来,许多人以csh交互方式使用其工作控制和历史记录功能,但使用Bourne sh编写脚本。这种情况不理想。

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

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

  4. 贝尔实验室和AT&T愚蠢地未能实现ksh开源。ksh88被广泛使用,但是拥有来源是非法的。某些人上瘾了,以致于成为数字罪犯。

    编辑:这真的那么愚蠢吗?很难知道。伯克利早已放弃了Unix,不久之后其他公司也纷纷效仿,但这仍然是企业大师们相信为Unix收费的时代。但是结果是:AT&T Unix在无数次被出售给各方之后就死了。BSD及其衍生版本还可以正常使用,但是这些新兴的东西(称为“ Linux”和“ GNU”)拥有巨大的份额,曾经属于贝尔实验室。

  5. 自由软件基金会从头开始实现POSIX外壳,并以Dave Korn的所有思想为最新思想,并以惯常的FSF风格添加自己的新功能(例如可编程完成功能)来创建“无尘室”。他们称其为“再次发生波恩”外壳,或bash

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

经验教训:

  • 第一款投放市场的合格产品胜出(sh)。

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

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


我认为您真的对bash在其他所有方面的普及有最完整,最准确的解释。我见过默认使用zsh的环境,但我讨厌它们,因为所有语法都有些偏离,我无法弄清楚它,否则会出错。

项目符号(1)需要校正:在伯恩(Bourne)壳是Mashey壳之前,在Mashey壳是ur-Shell之前是Ken Thompson壳。参见en.wikipedia.org/wiki/Unix_shell
Jim Ferrans,2009年

2
在不特别指责诺曼的情况下,这里存在许多错误。肯·汤普森(Ken Thompson)编写了第一个外壳,这是V6中唯一的外壳,并且在V7和32V中并行使用。斯蒂芬·伯恩(Stephen Bourne)不是“第一位”壳牌作家,他重写了KT壳牌。Csh直到4.1BSD才具有作业控制,尽管它是第一个获得此作业的Shell。Csh并没有改变任何shell语法,它与V6 shell以及Bourne shell都向后兼容。那时,几乎所有代码都已获得许可。对Unix收取许可费到底是什么愚蠢?
DigitalRoss

2
我可能无法很好地解释这一点,让我再试一次。Csh 早于Bourne,或者最晚在大陆之外并行执行。(在上网之前,这很重要。)当他写信时,我偶尔坐在Cory Hall的Bill Joy旁边。我绝对可以向您保证他是在V6上编写的。就像我说的那样,csh(和Bourne)是V6-Thompson向后兼容的,因为这就是他们编写它们时存在的全部。当然,这不是与伯恩兼容的,AFAIK Bill Joy的才华不包括对未来的了解
DigitalRoss

1
难道没有bash采用可编程完成的想法tcsh吗?

46

Bash有两件事完全不同。

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

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

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

两个贝壳的故事

壳的真实历史

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

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

另外,/ bin / sh需要静态链接。

如果有什么事情在/bin/sbin依赖/usr,这是破并需要固定的; 他们应该只依赖于中的库/lib。只login需要PAM;需要动态库的“较新的API”为NSS。“趋向”?NetBSD 2.0已经切换到完全动态的状态,/bin并且在/sbin5年前,FreeBSD 5.2甚至更早的版本以及Linux上都已经实现了。
迅速

2
我想很明确地说,我的答案是我的原创作品;没有从任何地方复制任何单词。
诺曼·拉姆齐

1
当然,我并不是说您粘贴了它,只是周围有很多错误信息,而且我不想因为报道了一个已经被误解的故事而殴打您。
DigitalRoss

6

添加到@DigitalRoss所说的内容

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

4

因为Linux只是内核(并且是必需的支持工具),而GNU提供(或确实提供了)所有使我们称之为“ Linux”可用的基本Unix软件克隆。Bash是GNU项目的shell,它是Unix版本7中较旧的Bourne shell(sh)的副本。


他不是在问“为什么有一个shell程序”
Hasen

@hasen j:问这个问题是否有历史原因,为什么他使用的所有Linux系统都默认使用Bash作为外壳程序。
2009年

2
@hasen j:beggs没有回答“为什么有shell程序”。您已经错过了答案的重点,显然所有其他SO蠢货低头者也是如此。

1

根据unix.com的调查,它距ksh并不远。
/ bin / sh 83 8.96%
/ bin / csh 36 3.89%
/ bin / ksh 370 39.96%
/ bin / tcsh 36 3.89%
/ bin / bash 401 43.30%


0

Bash由于其丰富的功能集而被广泛接受。它还采用了其他Shell(例如C壳和Korn壳)的功能。请看看这些功能。


0

因为'bash'是100%'sh / ksh'兼容的,而'ksh'是POSIX shell。

因此,如果您要使用POSIX兼容系统,并且您使用的是Linux,则可以使用bash。

如果您使用的是商业UNIX,通常会将ksh作为默认外壳程序(有时只是旧的sh)。由于某些原因,Sun仍默认使用flakey csh c-shell。

优点是可移植性,为hp-ux或AIX编写的.sh很有可能在没有任何更改的情况下作为linux“ bash”运行。


ksh不是POSIX shell。没有POSIX shell这样的东西。有一些外壳符合POSIX规范,这ksh是其中之一,但绝不是唯一的。

0

并添加到所有其他答案:zsh并不意味着要向后兼容。您可能可以对其进行设置,使其兼容,但随后您将失去其功能。

我确实将其zsh用作常规的交互式shell,但是bash/ dashshell脚本语言对我来说似乎更为理智;它们做的魔术更少,更容易预测……当我编写打算使用几年的脚本时,这对我来说更重要。


0

仅仅是用来迷惑的问题,该sh命令有时只是一个符号链接到另一个shell程序,比如ashbash或者dash

Ubuntu过去曾将其链接到bash,因为bash它旨在运行任何兼容的Bourne shell脚本。

不过,最近,Ubuntu切换到了sh链接dashdash设计用于运行bash脚本(因此也可以运行脚本sh),但是它仅设计用于脚本编写,因此缺少的交互功能bash。这使其更小(也许)更快。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.