Bourne | Ash | #! | find | ARG_MAX | Shells | whatshell | portability | permissions | UUOC | ancient | - | ../Various | HOME "$@" | echo/printf | set -e | test | tty defs | tty chars | $() vs ) | IFS | using siginfo | nanosleep | line charset | locale

Ash (Almquist Shell) 变体研究

2006-02-14 .. 2021-02-13 (参见最近的更改)

在多次思考了这些 "ash" 变体之间的关系,并且几乎没有找到任何相关信息之后,我对已知的一些变体进行了更深入的研究。

除了 BSD/OS 之外,所有变体都有源代码可用。 感谢 TUHS 存档了传统的 BSD 和 386BSD,感谢 Kirk McKusickCSRG archive,以及 Peter Seebach 允许我学习所有 BSD/OS 变体。

本文档记录了这些变体之间的关系。对于那些没有变更日志的变体(传统的 BSD、386BSD、BSD/OS 和 Minix),本文档旨在提供关于源代码更改的 完整 日志。但是,对于其他的、较新的变体,这显然不是目标,只列出了一些任意选择的更改或错误修复。为什么没有注释的差异?我无法完成这项工作。如果您对这个级别感兴趣,那么您已经在查看源代码,并且这些注释是一个好的开始。

内容:

· 1.) 原始版本 '89 · 2.) 传统 BSD: 4.3BSD-Net/2 '91, 4.4BSD-Alpha '92, 4.4BSD '93, 4.4BSD-Lite '94, 4.4BSD-Lite2 '95 · 3.) 386BSD '92-'93 · 4.) BSD/OS (BSDi) '91-'03 · 5.) NetBSD '93- · 6.) FreeBSD '96- · 7.) 从 NetBSD 到 Linux 的早期移植 '93 (以及早期的 Slackware、Debian) · 8.) dash '97- (以及后来的 Slackware) · 9.) dash 的 Slackware 变体 '06- · 10.) Android 变体 (源自 NetBSD) '05- · 11.) ash 的 Cygwin 变体 '98- · 12.) BusyBox '01- · 13.) Minix '01-

家族树图示(点击放大)。

1.) 原始版本 ('89) - sh(1)

它由 Kenneth Almquist 编写,作为传统 "System V Release 4" Bourne shell 的替代品,原因是 AT&T 和 Berkeley 之间的许可证战争。Berkeley 首先在 "BSD 4.3-Net/2" 中发布了它。源代码发布到了 comp.sources.unix, "A reimplementation of the System V shell",发布于 1989 年 5 月 30 日。此后不久,Kenneth 发布了一个 job control patch,以解决无法正确处理超过 4 个作业的问题。

首先,是一些概述,以便了解这些 almquist shells 的相关信息。

ash 家族和 SVR4 shell 之间的差异:

ash 变体和 SVR4 shell 独有,与其他 bourne 兼容 shell 相比:

仅在早期 ash 变体中找到的细节:

[1] | 事实上,没有 ash 变体 需要 "case x in (x)",因为解析器对 $(...) 命令替换中的 case 构造是健壮的。但是,其他几个 shell 不够健壮,他们必须以这种方式解决;所以这是一个脚本可移植性问题。它迟早会在大多数实现中得到修复:BSD/OS 3.0 (06/'96), dash-0.3.5-4 (08/'99) (因此 Busybox 和 Slackware 8.1 ff.), FreeBSD 4.8/5.1 (10/'02), NetBSD 4.0 (06/'06)。 ---|--- 早期和一些后来的 ash 变体中发现的细节:

在 ash、SVR4 shell 和大多数 bourne 兼容 shell 中发现的一个细节,但通常没有文档记录:

2.) 传统 BSD ('91-'95)

4.3BSD-Net/2 (06/'91) - sh(1)

4.4BSD-Alpha (06/'92) - 开始瞄准 POSIX.2 - sh(1)

4.4BSD (06/'93) - sh(1)

显然,386BSD patchkit 2.4 (本地副本) 进入此版本或反之亦然:

和:

4.4BSD-Lite (06/'94) - sh(1)

4.4BSD-Lite2 (06/'95) - sh(1)

此版本已在 05/'95 左右与 NetBSD 同步。

3.) 386BSD ('92-'93) - sh(1)

386BSD 发行版源自 4.3BSD-Net/2,旨在维护一个可运行的系统,也就是说,使用在许可战争后必须删除的部分来完成 Net2。

请参阅 TUHS 上的 386BSD 存档

4.) (BSDi) BSD/OS ('92-'03)

这是一个来自供应商 BSDi 的商业 BSD 分支。 例如,供应商 F5 使用 BSD/OS 4.1 作为其产品 BIG-IP 4.2 的核心。

因此,例如,与现代变体仍然存在以下差异:

5.) NetBSD ('93-current)

最初源自 386BSD-0.1 patchlevel 0.2.3,很快与 4.4BSD-Lite 同步。

一些变化:

NetBSD 0.80.9 (作者 Jason Steven aka Neozeed)。 netbsd.org 上的 CVS-Web (自 ~1.0 起)。

6.) FreeBSD ('94-current)

源自 4.4BSD-Lite, -Lite2NetBSD 1.2/1.3

一些变化:

CVS-Web 在 freebsd.org 上。

7.) 将 NetBSD 变体早期移植到 Linux ('93)

贡献者包括 Sunando Sen, Arjan de Vet, Florian La Roche。 此早期移植与 Herbert Xu 的后来的 dash 无关。