我注意到基本上我使用过的系统都没有/bin/sh
真正的可执行文件。它始终是 POSIX 模式下的dash
符号链接bash
或类似的东西。
为什么?使用真实的原创有什么缺点/bin/sh
? (速度?许可?)
答案1
答案2
你的问题中的陈述是不正确的。 Solaris 最高版本 10是提供传统的真正的 Bourne shell 作为/bin/sh
.这样做不是为了破坏与旧脚本的兼容性,因为旧脚本在不同的 shell 中可能会失败。但除此之外,这个选择还是非常令人沮丧的。
大多数(如果不是全部)剩余的 Unix 和类 Unix 版本(包括 Solaris 11)确实提供了 POSIX 兼容 shell,因为/bin/sh
POSIX 要求sh
命令启动 POSIX shell,而不是不兼容的旧版 Bourne shell。/bin/sh
一般是:
ksh88
或者ksh93
在商业 Unix 实现上- 修改
bash
过OS/X
(虽然以前是zsh
) - 一个
ash
或pdksh
其他的衍生物BSDs
bash
或dash
在 Gnu/Linux 发行版上。
它不一定是链接,但可以是除 Gnu/Linux 之外的许多系统上的真正可执行文件。
有趣的是,尽管对你的问题提出了最受支持的答案,但并不是缺乏功能导致发行版开发人员安装与旧版 Bourne shell 不同的东西,/bin/sh
而是希望尽可能兼容 POSIX,即表现得像一个类似 Unix 的操作系统。 POSIX shell 比旧版 Bourne shell 具有更多功能这一事实只是此标准合规性目标的副作用。
值得注意的是bash
,某些 shell 在调用时的行为有所不同sh
,这主要是从 shell 中删除功能,而不是相反。
答案3
据我所知,原始的 Bourne shell 不能被 BSD 和 GNU 项目使用,因为它的许可证。
当时最初的 Unix 没有许可证,GNU 项目需要一个 GPL 下的 shell,所以他们使用了 bash。
对于所有 BSD 的父级 BSD4 来说也是如此。由于 AT&T 的诉讼,他们需要重写原始 Unix 的所有源代码,包括 Bourne shell。
在传统的 BSD 系列中,Bourne shell 一直到 4.3BSD-Reno 为止(但 Net/2 和后续的 4.4BSD 不再提供)。由于许可原因,它随后被 Kenneth Almquist(通常称为 ash)的 bourne 兼容、类似 svr4 的 sh 所取代。
来自 FreeBSDman sh
sh 命令,即 Thompson shell,出现在版本 1 AT&T UNIX 中。它在版本 7 AT&T UNIX 中被 Bourne shell 取代,Bourne shell 继承了名称 sh。
这个版本的 sh 是在 1989 年根据 AT&T System V Release 4 UNIX 的 Bourne shell 在 BSD 许可下重写的
因此,这两个项目都被迫不使用 Bourne shell,而选择真正的开源 shell。