Bash是在每一个Linux发行版我曾尝试使用默认情况下,在类似的替代品的Z shell(zsh中)。是否出于技术或历史原因?
Bash是在每一个Linux发行版我曾尝试使用默认情况下,在类似的替代品的Z shell(zsh中)。是否出于技术或历史原因?
Answers:
历史(不是通过研究获得的,而是通过花太多时间与贝尔实验室的人们闲逛而获得的):
最初(如果您以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。
Shell只是一个用户程序,因此任何人都可以编写一个。在新泽西州创建第7版Unix时,在加利福尼亚创建了伯克利Unix。Berkeley的Bill Joy编写csh
了C shell。乔伊增加了工作控制和历史记录,以及后来的命令行编辑,但是他并不了解伯恩的工作,因此他的语言基于汤普森的外壳(在上一篇文章中我称之为“史前史”)。Unix社区喜欢工作控制,但是他们也喜欢Bourne的语言。有关针对csh语言的争论特别不好的内容,请参阅《认为有害的Csh编程》。一段时间以来,许多人以csh
交互方式使用其工作控制和历史记录功能,但使用Bourne sh
编写脚本。这种情况不理想。
编辑:感谢DigitalRoss对我的时间顺序的整理csh
。由于我是从那些将BSD称为“伯克利异端”的人那里接受教育的,所以我那里的事实非常缺乏。
贝尔实验室的Dave Korn对Bourne外壳进行了出色的重新设计,以生产Korn外壳(ksh)。它与Bourne外壳完全向后兼容,sh
但提供了大量宝贵的改进。 ksh
成为POSIX标准的基础,并随Sun软件一起提供。(尽管Bill Joy离开了伯克利帮助找到Sun,并且是他们的领先软件专家之一。)
贝尔实验室和AT&T愚蠢地未能实现ksh
开源。ksh88
被广泛使用,但是拥有来源是非法的。某些人上瘾了,以致于成为数字罪犯。
编辑:这真的那么愚蠢吗?很难知道。伯克利早已放弃了Unix,不久之后其他公司也纷纷效仿,但这仍然是企业大师们相信为Unix收费的时代。但是结果是:AT&T Unix在无数次被出售给各方之后就死了。BSD及其衍生版本还可以正常使用,但是这些新兴的东西(称为“ Linux”和“ GNU”)拥有巨大的份额,曾经属于贝尔实验室。
自由软件基金会从头开始实现POSIX外壳,并以Dave Korn的所有思想为最新思想,并以惯常的FSF风格添加自己的新功能(例如可编程完成功能)来创建“无尘室”。他们称其为“再次发生波恩”外壳,或bash
。
在1990年代中期,AT&T开源了ksh93
,但到那时为时已晚,不能被广泛采用。奇怪的是,许可协议是非标准的。 bash
并ksh
发散,ksh
从未达到与其历史地位相称的市场份额。
经验教训:
第一款投放市场的合格产品胜出(sh)。
人们喜欢新功能(作业控制,命令完成),但是当旧脚本继续运行时,他们会更喜欢它们。
编辑:工程学教授应将历史留给科学史学家:-)
Bash有两件事完全不同。
这是一个很好的外壳。它可能是2个shell中的一个(另一个是zsh),它将一些很酷的csh
功能(例如!
历史记录替换)集成到posix语法中。它具有很多扩展,包括数组。
它是FSF / GNU Shell。在开源世界中,这给了它一种声望。
我还应该补充一点,它并不总是默认的。ash
通常用作/ bin / sh,因此虽然bash
可能是交互式外壳,但仍ash
是“仅运行命令文件”外壳。这是因为ash
它更小,更快,并且包含posix功能,因此它是一个适当的子集。使用ash
作为一个交互式shell有时是有问题的。例如,在NetBSD上,它运行良好,因为它具有所有功能。这是他们的一个外壳,而bash
只是一个外部包装。但是在Linux ash
上通常被认为是非交互式的,因此他们编译它时没有历史记录,也没有进行(重要的)行编辑的理论,因为它仅用于运行那些巨大的gnu configure
脚本。
壳的真实历史
更新:在网络上从一个地方到另一个地方复制外壳的历史不准确,人们相信这是可以理解的。我将尝试给出一个准确的版本,并在此处提供一些链接来证实它。
<, >, >>, |, &
但goto
通过通过外部程序输入标准输入即可获得简单的控制语法。那时没有复杂的外壳脚本。以后的shell将在单独的fd上打开命令输入。今天看起来很简单,但在1970年代的恐怖电影中,这是地球上最好的东西。信不信由你,这个古老的外壳如今拥有自己的Twitter流,当然还有主页。csh
, 写入(象vi
)由比尔乔伊在UCB。这是在GNU readline和NetBSD editline之前的,因此使用该!
语法进行历史记录一定看起来是完全合理的。Csh添加了当今大多数Shell功能,但具有csh语法。csh并没有随意更改任何语法。它实际上是向后兼容Thompson Shell的,最初包含TS源代码。osh
并csh
留下流行了一段时间。没有互联网,而且它是获得许可的软件,因此在那种环境下,斯蒂芬·伯恩很可能不了解乔伊的外壳,当然乔伊也不知道伯恩。当UCB获得VAX和现在被人们遗忘的Unix / 32V的预发行版时,这两个外壳可能首次相遇。我记得比尔抱怨内存分配。请注意,两个外壳都向后兼容V6外壳,他们只是将语法扩展到不同的方向。 ksh
。最终,它csh
具有半可用的源代码,但是它被AT&T与加利福尼亚大学之间的诉讼所束缚。尽管如此,这仍然是BSD Unix的辉煌日子,因为有能力负担5万美元费用的老牌公司可以购买AT&T许可证,但可以安装4.x BSD发行版,而大学免费提供。csh
Bourne shell语法一样多,并且有一些将两者合并。你有至少tcsh
,zsh
,bash
,和ash
。Bourne语法是“正式的”语法,是AT&T发行版的一部分,但是在那时BSD非常重要,而Sun(最初是BSD)分发了全世界所遇到的大量Unix SW。/bin
和/sbin
依赖/usr
,这是破并需要固定的; 他们应该只依赖于中的库/lib
。只login
需要PAM;需要动态库的“较新的API”为NSS。“趋向”?NetBSD 2.0已经切换到完全动态的状态,/bin
并且在/sbin
5年前,FreeBSD 5.2甚至更早的版本以及Linux上都已经实现了。
Bash由于其丰富的功能集而被广泛接受。它还采用了其他Shell(例如C壳和Korn壳)的功能。请看看这些功能。