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


55

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

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


3
您只使用过Linux,对吗?我只在Linux上看到过“ sh as symlink”。
Greg Hewgill 2013年

@GregHewgill Solaris的最新版本没有sh链接到ksh吗?
吉尔(Gilles)'所以

1
@Gilles根据一个答案,是的,因为Solaris11。它链接到ksh
奋斗

1
@GregHewgill我也使用过达尔文,它与bashIIRC链接。
奋斗

6
原始的/ bin / sh是什么意思?来自Unix V1的Thomson Shell?Unix V7中的Bourne shell没有功能,没有注释...?SysIII,SysV,Solaris,HP / UX中的一个在BSD上重新实现了?如今,sh它基于一个标准,这意味着只要您在脚本中使用标准语法,我们就可以有几种实现方式可以以明确指定的方式运行。
斯特凡Chazelas

Answers:


38

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

但是代码现在可用。您可以看一下,进行编译,然后试一下。


50
然后迅速切换回以前使用的状态。
伊格纳西奥·巴斯克斯

24
@strugee“”功能不足“-为什么会出现问题?”是的,很好的观点...当程序员可以使用已有的任何内容编写程序时,为什么程序员会使用诸如汇编/ C /高级语言之类的无用的东西直接机器语言?事实是:功能=开发速度提高+可维护性提高=成本降低=更好使用sh与使用bash完全相同,不同之处在于:速度较慢,程序更长,而且难以维护。
Bakuriu

10
它并不是真正缺乏功能,而是POSIX要求sh命令运行POSIX兼容shell 的事实,而传统的Bourne shell却没有。尽管POSIX不需要sh位于中/bin/sh,但这是它最符合逻辑的目录。
jlliagre

4
@Bakuriu命令历史记录和命令行编辑都是脚本真正不需要的。
13年

4
@strugee并不是唯一的区别。例如sh没有波浪和括号扩展,一些内置插件缺失(如pushdpopdselect)没有算术扩展。缺少许多变量,例如PIPESTATUS
Bakuriu

23

您问题中的陈述不正确。Solaris 10之前的Solaris 正在提供旧的真正的Bourne shell /bin/sh。这样做是为了不破坏与可能因其他Shell而失败的旧脚本的兼容性。否则,这个选择非常令人沮丧。

大多数(如果不是全部)其余的Unix和类似Unix的发行版(包括Solaris 11)的确提供了POSIX兼容外壳,/bin/sh因为POSIX要求sh命令启动POSIX外壳,而不是不兼容的旧版Bourne外壳。/bin/sh通常是:

  • ksh88ksh93在商业Unix实现上
  • 修改bashOS/X(尽管以前是zsh
  • 一个ashpdksh另一个的派生BSDs
  • bashdash在Gnu / Linux发行版上。

它不一定是链接,但可以在许多系统(但Gnu / Linuxes)上是真正的可执行文件。

有趣的是,尽管最能回答您问题的答案是什么,并不是不是缺少导致发行人安装不同于传统Bourne shell的功能的功能,/bin/sh而是希望尽可能地符合POSIX,即表现得像Unix之类的OS。POSIX外壳比传统的Bourne外壳具有更多功能的事实仅仅是此标准合规目标的副作用。

这也是一个事实,有些外壳bash在调用时的行为特别不同sh,这主要是从外壳中删除功能,而不是相反。


16

据我所知,由于其许可证,原始的Bourne shell无法由BSD和GNU项目使用。

那时原始的Unix没有许可证,GNU项目需要一个位于GPL下的shell,因此他们使用了bash。

对于所有BSD的父级BSD4来说,情况也是如此。由于AT&T的诉讼,他们需要重写原始Unix(包括Bourne shell)中的所有源代码。

在传统的BSD产品线中,Bourne外壳一直运到4.3BSD-Reno(但Net / 2和以下4.4BSD不再适用)。出于许可的原因,肯尼思·阿尔姆奎斯特(Kenneth Almquist)将其替换为与bourne兼容的,类似于svr4的sh(通常称为ash)。

从FreeBSDs man sh

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

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

因此,两个项目都被迫不使用Bourne Shell,而选择真正的开源Shell。


7

还有其他问题。Bourne Shell确实使用sbrk()而不是malloc(),这使它不是很可移植。

在Bourne Shell通过OpenSolaris成为OpenSource之后,我在Geoff Collyer的帮助下(用同一人避免了Korn Shell)。

我之所以制作便携式版本的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位数分辨率的高级自动定时
  • 推送/弹出/目录
  • 内置“查找”
  • 管从stderr
  • 使用vfork()获得更好的性能。
  • 最终修复了SVr4 Bourne Shell中所有已记录的错误,例如,suspended始终在作业控制模式下工作。...

在线手册页位于: 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我对反馈感兴趣


嗨Joerg。为什么将它们移植到Bourne shell而不是像某些BSD sh或pdksh这样已经被POSIX化的shell?
斯特凡Chazelas

Bourne Shell移植不使用stdio,因此是一个挑战。这与获取原始csh源并通过替换以VAX汇编器编写的非stdio printf使其进行编译是类似的挑战。但是我已经在Bourne Shell中添加了许多较新的POSIX功能,并且我希望与SchilliX上的Bourne Shell一起使用,以便允许它在单独的文件系统上使用/ anr / usr启动,而这在Korn Shell中是不可能的。
2015年

还要注意,我想验证ksh的速度是由使用vfork()引起的。现在,我将Bourne Shell转换为使用vfork()的速度与最新的ksh版本一样快。只有从原始的Bourne Shell源代码开始时,您才能获得这种体验。
2015年

好的,但是直到使您的sh POSIX兼容为止,它不太可能引起很多兴趣。我记得您曾在Austin组ML上询问过Bourne shell与POSIX的不兼容性,这是您正在研究的东西吗(这意味着要打破Bourne shell的向后兼容性)?人们(至少我)也认为POSIX sh语法是在Bourne shell上的进步。继续将您的Bourne外壳称为Bourne外壳可能会产生错误的印象。bimsh怎么样(Bourne改进了(ala vi / vim))?
斯特凡Chazelas

我的Bourne Shell在某些方面已经比ksh更好,例如,如果现代的ksh仍然基于SVr2,则基于现代UNIX功能实现更好的别名,push / popd / dirs和资源使用支持。您可能对Shell感兴趣并且很熟练,在阅读以下内容后,我想在Bourne Shell中获得您想看的内容的想法:schillix.sourceforge.net/man/man1/bosh.1.html注意到目前为止,我已经使用了所有新代码#ifdef,并且需要通过set(1)启用某些功能(例如stderr管道)。
2015年

4

它链接到提供100%向后兼容性的 shell 。您不会失去原始Shell所拥有的任何东西,但会在其之上获得更多功能。没有缺点,为什么要错过新功能?这就是为什么/bin/vi通常与vim链接的相同原因。


5
缺点是人们写的脚本可以在一个系统上运行,而认为它们的脚本兼容。我曾经修复了将近一百个Gentoo shell脚本,这些脚本实际上需要bash但被称为/ bin / sh。当我将/ bin / sh改为破折号而不是bash时,它们都坏了。
Zan Lynx

3
“没有缺点”-速度。例如bash,比dash
13年

@strugee如果您正在外壳中寻找ms范围内的改进速度,则可能是您没有使用正确的工具来完成这项工作。
克里斯·唐尼

1
@ChrisDown定义“ ms范围内的改进”吗?
13年

2
POSIX sh语法与Bourne sh语法不完全向后兼容。例如,IFS=,; rm file1,file2,file3将在Bourne shell中删除这3个文件。该(傻)功能已在POSIX sh中删除。有许多细微的差异可能导致为Bourne shell编写的脚本与POSIX sh的工作方式不同。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.