我尝试过的每个 Linux 发行版都默认使用 Bash,而不是其他选择,例如Z壳(zsh)。这有什么技术或历史原因吗?
答案1
历史(不是通过研究获得的,而是通过花费太多时间与贝尔实验室的人一起相处获得的):
一开始(如果你认为开始是 Unix 版本 7)是 Bourne shell。Steve Bourne 是第一个证明控制用户交互的 shell 可以是一个用户程序而不是操作系统的一个特殊部分的人。这是一个历史性的突破。shell 本身对于脚本来说相对干净,但没有命令行编辑或作业控制。Bourne 的Unix Shell 简介对于今天的初级用户来说仍然有用。
编辑:我忽略了 Ken Thompson 和 John Mashey(也来自 Multics)的一些“史前史”。我确信 Bourne 知道所有这些工作(他和他在贝尔实验室的同一个实验室 1127),但 Bourne 的 shell 是权威的,早期的工作影响不大,除非 Steve Bourne 对其进行了解释。例如,虽然 Ken 后来编写了 Plan 9 C 编译器,并且对 Plan 9 产生了很大影响,但 Tom Duff 关于 Plan 9 shell 的论文(rc)只提到了 Bourne 的 shell,而没有提到 Thompson 的 shell。
shell 只是一个用户程序,因此任何人都可以编写一个。当第 7 版 Unix 在新泽西州创建时,伯克利 Unix 也在加利福尼亚州创建。伯克利的 Bill Joy 编写了
csh
C shell。Joy 添加了作业控制和历史记录,以及后来的命令行编辑,但他不知道 Bourne 的工作,因此他的语言基于 Thompson shell(我在上一篇文章中认为它是“史前”的)。Unix 社区喜欢作业控制,但他们也喜欢 Bourne 的语言。有关对 csh 语言的不太好的争论,请参阅Csh 编程被认为有害。有一段时间,许多人使用csh
interactively 来控制作业和历史记录,但使用 Bournesh
来编写脚本。这种情况并不理想。编辑:感谢 DigitalRoss 帮我理清了 BSD 的发展历程
csh
。由于我的教育对象是那些将 BSD 称为“伯克利异端”的人,所以我在这方面缺乏足够的事实依据。贝尔实验室的 Dave Korn 对 Bourne shell 进行了出色的重新设计,从而生成了 Korn shell (ksh)。它与 Bourne shell 完全向后兼容,
sh
但提供了很多宝贵的改进。ksh
它成为 POSIX 标准的基础,并作为 Sun 软件的标准配置提供。(尽管 Bill Joy 离开伯克利去帮助创立 Sun,并且是该公司的主要软件人员之一。)贝尔实验室和 AT&T 愚蠢地未能实现
ksh
开源。ksh88
被广泛使用,但拥有源代码却不合法。有些人沉迷其中,以至于成为数字罪犯。编辑:这真的那么愚蠢吗?很难说。伯克利已经免费提供 Unix,其他公司也很快效仿,但这仍然是企业主相信 Unix 收费的时代。但结果是:AT&T Unix 死了,在被多次出售给各方之后。BSD 及其衍生产品仍然活跃,但这些被称为“Linux”和“GNU”的新兴事物占据了曾经属于贝尔实验室的很大一部分市场份额。
自由软件基金会 (Free Software Foundation) 做了一个“洁净室”,从头开始实现 POSIX shell,采用了 Dave Korn 当时的所有想法,并按照 FSF 的惯常风格添加了自己的新功能,例如可编程完成。他们称之为“Bourne again”shell,或
bash
。20 世纪 90 年代中期,AT&T 开放了源代码
ksh93
,但那时已经太迟了,无法广泛采用。许可协议很奇怪,不标准。bash
而且ksh
存在分歧,ksh
从未达到与其历史地位相称的市场份额。
教训:
第一个进入市场的合适产品获胜(sh)。
人们喜欢新功能(作业控制、命令完成),但当旧脚本能够继续运行时,他们会更喜欢这些功能。
编辑:工程学教授应该把历史留给科学史学家:-)
答案2
Bash 有两个完全不同的东西。
这是一款出色的 shell。它可能是将一些很酷的
csh
功能(如!
历史替换)集成到 posix 语法中的 2 个 shell 之一(另一个是 zsh)。它有很多扩展,包括数组。它是 FSF/GNU shell。在开源世界中,这赋予了它某种声望。
我还应该补充一点,它并不总是默认的。ash
通常用作 /bin/sh,因此虽然bash
可能是交互式 shell,ash
但它是“仅运行命令文件”的 shell。这是因为ash
它更小、更快,并且包含 posix 功能,因此它是一个适当的子集。用作ash
交互式 shell 有时会出现问题。在 NetBSD 上,它运行良好,因为它内置了所有功能。它是一种 shell,而是bash
一个外部包。但在 Linux 上ash
通常被认为是非交互式的,因此他们在编译它时没有历史记录,也没有(重要的)行编辑,理论上它只是用来运行那些巨大的gnu configure
脚本。
两枚贝壳的故事
贝壳的真实历史
更新:网络上流传着一个不准确的 shell 被从一处复制到另一处的故事,人们自然而然地相信了它。我将尝试给出一个准确的版本,并提供一些链接来证实它。
- 第一个 shell 肯定不是 Bourne shell,而是由 Ken Thompson 自己编写的,并发布在 V6 中,这是 AT&T 发送给各个大学和政府实验室的版本。这就是 Unix 出名的原因。它具有所有基本功能,
<, >, >>, |, &
但它只是goto
通过一个在标准输入上查找的外部程序具有简单的控制语法。当时没有复杂的 shell 脚本。后来的 shell 会在单独的 fd 上打开命令输入。它在今天看起来很简单,但在 1970 年代的计算机恐怖电影中,它是世界上最好的东西。信不信由你,这个古老的 shell 已经自己的推特流今天,当然,主页。 - 第二個軟件曾是
csh
, 原样vi
撰写比尔·乔伊在 UCB。这是在 GNU readline 和 NetBSD editline 之前,因此用语法来记录历史似乎是完全合理的!
。Csh 添加了当今大多数 shell 功能,但使用的是 csh 语法。csh 没有改变任何语法,无论是免费还是其他方式。它实际上向后兼容 Thompson shell,并且最初包含 TS 源代码。 - 第三个 shell 是 Bourne shell,语法不同。Unix 当时在 UCB 和 AT&T 并行开发。这个 shell 有一个奇怪的内存分配器(我认为它只是使用了更多内存,捕获了 SIGSEGV,做了一个新的 brk(2),然后再次尝试),这使得它很难在新的 Unix 端口上运行,所以在一段时间内
osh
一直csh
很受欢迎。当时没有互联网,而且它是 SW 许可的,所以在那种环境下,史蒂芬伯恩不知道 Joy 的 shell,当然 Joy 也不知道 Bourne。这两个 shell 可能第一次见面是在 UCB 获得 VAX 和预发行版时现已被遗忘的 Unix/32V我记得 Bill 抱怨过内存分配。请注意这两个 shell 都向后兼容 V6 shell,他们只是在不同方向上扩展了语法。 - 现在确实有多个不兼容的 shell,AT&T 在其中添加了 Bourne 兼容的
ksh
。最终,csh
有半可用的源代码,但它被捆绑在一个AT&T 与加州大学之间的诉讼。然而,这仍是 BSD Unix 的辉煌岁月,因为那些有能力支付 50,000 美元费用的高端公司会购买 AT&T 许可证但安装 4.x BSD 发行版,而大学则免费获得它。 - 在这种存在许多法律和技术问题的情况下,人们进行了各种独立的实施。至少有
csh
与 Bourne shell 语法一样多的语法,有些则将两者合并。至少有、、tcsh
和。Bourne语法是“官方”的,是 AT&T 版本的一部分,但在那些日子里,BSD 非常重要,而 Sun(最初是 BSD)分发了世界上遇到的相当一部分 Unix SW。zsh
bash
ash
- 部分原因是 USL 的诉讼,让 FSF 和 Linux 有了广阔的舞台。与此同时,AT&T 成功地与地球上为数不多的几个比他们大的实体之一(加利福尼亚州)展开了斗争,最终他们没有赢得这场诉讼,因此 BSD 发行版最终获得了牢固的法律基础。但那时 Linux 和 bash 已经无处不在,所以今天的 BSD 只是一个小众市场。
- 最后,bash 是一个很好的 shell(尽管它的原作者显然私下否认了这一点),它完全值得为自己的成功赢得赞誉。即使 ash、bash 和 ksh 没有赢得语法之战,csh 也会被 tcsh 和 zsh 所取代。
答案3
补充一下@DigitalRoss 所说的话
- Bash 是 posix-sh 的完全超集替代品,甚至在调用时将其称为 /bin/sh 时会完全模拟 posix-sh。Posix-sh 是商业 unix 系统的“标准”,是通用 shell。因此,从那里开始并在此基础上构建的东西需要付出很多努力。
答案4
根据 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%