为什么没有人使用真正的 Bourne shell 作为 /bin/sh?

str*_*gee 55 shell dash history

我注意到基本上我曾经使用过的系统都没有/bin/sh真正的可执行文件。它总是一个符号链接dashbash在POSIX模式,或者类似的东西。

为什么?使用真正的、原始的有/bin/sh什么缺点?(速度?许可?)

Bru*_*ger 39

我猜缺少功能 - 没有命令历史记录,没有花哨的重定向,没有命令行编辑。csh由于这些原因,BSD 引入了 C shell。另一个因素是正版 Bourne Shell最近才以开源形式提供。除非您获得许可,否则您无法分发它。这使得免费发行版无法实现它,并使其在意识形态上对其他发行版和 *BSD 不受欢迎。

但是代码现在可用。你可以看看,编译它,试一试。

  • 然后立即切换回您之前使用的任何内容。 (52认同)
  • @strugee ""缺乏功能" - 为什么会出现问题?" 是的,好点......为什么程序员使用无用的东西,如汇编/C/高级语言,而你可以用它们做任何事情你已经可以编写直接机器语言?事实是:*特性 = 提高开发速度 + 增加可维护性 = 更少成本 = 更好* 使用 `sh` 与使用 `bash` 完全一样,除了它:更慢,程序更长,更难维护。 (24认同)
  • 这并不是真的缺乏功能,而是事实上 POSIX 要求`sh` 命令运行符合 POSIX 的 shell,而传统的 Bourne shell 则不是。虽然 POSIX 不要求 `sh` 位于 `/bin/sh` 中,但这是它最合乎逻辑的目录。 (10认同)
  • @Bakuriu 命令历史记录和命令行编辑都是脚本所不需要的。 (4认同)
  • @strugee 这些不是*唯一的*差异。例如`sh`没有波浪号和大括号扩展,缺少一些内置函数(例如`pushd`和`popd`,`select`)没有算术扩展。缺少很多变量,例如`PIPESTATUS`。 (4认同)
  • “缺乏功能” - 为什么这会成为一个问题?你会用它来编写脚本,然后使用更好的东西,比如用于交互式用户的 `bash` 或 `zsh`,对吗? (3认同)
  • 真正的 Bourne shell 没有内置算术,没有 ((...)),没有 $(...)(这意味着你必须使用 \`...\`,这会导致非常混乱的嵌套和引用) . 没有函数局部参数,只有全局参数。没有数组。没有 POSIX 字符串或此处的字符串。没有过程替代。即使对于脚本中的非交互使用,它也明显不如 bash/ksh/zsh。 (2认同)

jll*_*gre 24

您问题中的陈述是不正确的。的Solaris的最高版本为10提供传统真正的Bourne shell作为/bin/sh。这样做不是为了破坏与可能因不同 shell 失败的旧脚本的兼容性。否则,这个选择非常令人沮丧。

大多数(如果不是全部)剩余的 Unix 和类 Unix 版本(包括 Solaris 11)确实提供了 POSIX 兼容的 shell,/bin/sh因为 POSIX 要求sh命令启动 POSIX shell,而不是不兼容的传统 Bourne shell。/bin/sh一般是:

  • ksh88ksh93在商业 Unix 实现上
  • 经修饰的bashOS/X(尽管它使用的是zsh
  • 一个ashpdksh其它衍生物BSDs
  • bashdash在 Gnu/Linux 发行版上。

它不一定是链接,但可以是许多系统上的真正可执行文件,但 Gnu/Linux 除外。

有趣的是,尽管对您的问题提出了最高投票率的答案,但导致发行版开发人员安装与传统 Bourne shell 不同的东西的并不是缺少功能,/bin/sh而是希望尽可能符合 POSIX,即表现得像一个类 Unix 操作系统。POSIX shell 比传统 Bourne shell 具有更多功能的事实只是此标准合规性目标的一个副作用。

这也是一个事实,特别是一些 shellbash在调用 时表现不同sh,这主要是从 shell 中删除功能,而不是相反。


Rap*_*ens 16

据我所知,最初的 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。

来自 FreeBSD man sh

sh 命令,Thompson shell,出现在版本 1 AT&T UNIX 中。它在版本 7 AT&T UNIX 中被 Bourne shell 取代,它继承了名称 sh。

此版本的 sh 于 1989 年在 BSD 许可下在 AT&T System V Release 4 UNIX 的 Bourne shell 之后重写

所以这两个项目都被迫不使用 Bourne shell,而是选择了一个真正的开源 shell。


sch*_*ily 9

还有其他问题。Bourne Shell 确实使用了 sbrk() 而不是 malloc() 这使得它不是很便携。

在 Bourne Shell 通过 OpenSolaris 成为开源之后,我在 Geoff Collyer(帮助避免 sbrk() 在科恩壳牌)。

我制作 Bourne Shell 便携式版本的最初原因是,我喜欢让我在 1982 年到 1984 年间为“bsh”编写的历史编辑器也可以在 Bourne Shell 中使用。同时,我将我为“bsh”编写的大部分独特特性移植到了 Bourne Shell。

这是其中之一:

  • 几乎所有地方都可以编译和运行,包括 Cygwin(比 bash 快近 2 倍)
  • 带有 LRU 环形缓冲区的历史编辑器
  • 内置 TERMCAP
  • 高级别名(全局持久别名、本地别名……)以及“dosh”内置,Bourne Shell 是唯一允许参数化别名的 Bourne Shell 实现。
  • 支持在原始模式下在历史编辑器中编辑复杂的别名。
  • 通过 .sh.* 变量访问 exit(2) 代码的所有 32 位。
  • 具有 6 位分辨率的高级自动计时
  • 推送/弹出/目录
  • 内置“查找”
  • 来自标准错误的管道
  • 使用 vfork() 以获得更好的性能。
  • 最终修复了 SVr4 Bourne Shell 中所有记录的错误,例如挂起始终在作业控制模式下工作。...

在线手册页位于: http ://schillix.sourceforge.net/man/man1/bosh.1.html 源代码是 schily 工具箱的一部分,位于:

https://sourceforge.net/projects/schilytools/files/

我建议使用:http : //sourceforge.net/projects/schilytools/files/schily-2015-08-18.tar.bz2 或更新的版本。

PS我对反馈感兴趣