为什么在类似Unix的系统中有多个shell?


16

我刚刚开始学习Unix的基础知识,并且想知道为什么在类似Unix的系统中有那么多shell。摘自《Unix环境中的高级编程》一书:

Shell是一个命令行解释器,它读取用户输入并执行命令。用户对Shell的输入通常是从终端(交互式Shell)或有时是从文件(称为Shell脚本)输入的。

然后,本书继续列出了一些shell程序,例如Bourne shell,Bourne-again shell,Cshell等。我的问题基本上是为什么我们需要多个外壳?


4
适用于各种其他技术的标准如此之多的相同原因也适用。 xkcd.com/927
Dan在火光中摆弄

1
出于同样的原因,为什么可以使用多种编程语言的编译器/解释器(一种语言也需要多种编译器)或多个Internet浏览器。
Mischa Arefiev 2012年

6
您的问题很冒昧。“ 为什么我们需要多个外壳? ”谁告诉您我们需要多个外壳?您的书说我们多个炮弹。那不是同一回事。
罗布

Answers:


15

现代UNIX环境中使用的大多数shell都符合POSIX sh规范。POSIX sh是从原始的Korn shell(ksh88)派生而来的,而korn88又是从较早的Bourne shell派生的,但是POSIX sh仅指定了ksh88功能的一小部分。仅实现最低要求的外壳缺少以安全合理的方式编写除最琐碎的脚本之外的所有脚本所需的许多功能。例如,局部变量和数组是非标准的额外功能。

因此,第一个原因是要使用其他功能扩展外壳。不同的外壳选择专注于不同的事物。例如,Zsh专注于高级交互功能,而ksh93(当前的“原始” korn shell)专注于强大的编程功能和性能。即使像Dash这样的最小外壳程序也至少会添加一些非标准的额外内容,例如局部变量。

如果有的话,额外的功能很少能广泛地互操作。大多数ksh88功能集都具有很好的互操作性,例如扩展的globlob语法,但是对于非标准功能,无法保证,您必须真正了解以可移植的方式使用它们的方式。

第二个原因是遗产。仍然有许多专有的Unix,它们的/ bin / sh使用古老的非标准实现。直到最近,Solaris仍将Bourne用作其默认功能,并选择维护Heirloom外壳而不是升级到现代版本。这些系统通常带有不同的外壳,您可以切换到这些外壳,例如,通过更改PATH变量或更改单个脚本中的shebang。

总结一下。有多个外壳,通常默认情况下:

  • 为了获得额外的功能,尤其是处理非便携式的额外功能。
  • 处理通常不需维护的旧脚本。
  • 尺寸/性能。嵌入式系统通常需要小型外壳,例如mksh或busybox sh。
  • 许可原因。直到2000年左右,AT&T ksh才是专有软件。这在很大程度上导致了所有类似ksh的克隆,例如Zsh和Bash。
  • 其他历史原因。尽管今天不是很流行,但是已经进行了重新设计该语言的激进尝试,例如scsh和es。许多shell的进程替换功能最初来自rc(语法略有不同),而括号来自csh。不同的外壳具有可用的这些特征的不同组合,通常会有一些细微的差别或不那么细微的差别。

2
请注意,尽管local不是POSIX或Unix,但在Linux 标准(LSB)和debian策略标准中已指定并要求使用它。请注意,这es是的后续内容rc
斯特凡Chazelas

1
现在mksh起源于Public Domain Bourne Shell,它也是出于许可原因而编写的。(这些问题仍然存在-许可,可移植性和规模是帮助我说服Google将mksh包含在Android中的三个因素。)
mirabilos 2014年

19

因为人们有不同的需求,所以在给定情况下最好有其他替代方法来满足您的需求。Shell本身只是一个工具,我认为应该可以用其他任何工具替换。这就是Unix / Linux的功能,与Microsoft Windows选择的功能相反。

同样...为什么会有这么多的文本编辑器?人们为什么要开发新的浏览器(如果已有的话)?为什么会有GNOME,KDE,Xfce,LXDE,E17等?


12
精确地 一个人可能会问“为什么有那么多窗口管理器?” 也一样 Unix本地用户可能会问相反的问题:为什么只有一个CMD.EXE?为什么Windows如此僵化且不可自定义?
Bruce Ediger 2012年

1
@BruceEdiger是什么意思,只有一个cmd.exe?如果您想使用它们,还有其他选择。甚至Microsoft本身也可以使用PowerShell作为替代方案。
马尔科姆

3
即使COMMAND.COM在DOS中也可以替换。但是,由于其他应用程序(和其他用户)的假设,您通常会获得非常脆弱的系统。结果,几乎没有成功的替代方法CMD.EXE。一种是PowerShell,它具有Microsoft支持的惯性。另一个例子很奇怪,bash这是由于Cygwin社区的良好支持,更不用说MinGW了。至于窗口管理器,Windows一次只能有一个,但是随着时间的推移,随着Windows环境本身的发展,已经有了多个。
RBerteig

为此答案+1。我认为这就是为什么我们有这么多种不同的UNIX风格:AIX,HP-UX,Solaris,Tru64,IRIX,UnixWare,OS X,Linux,FreeBSD,NetBSD,OpenBSD,...,您就是这样!
tonga 2014年

4

简短答案

由于许可历史悠久,因此没有一个实体开发过Unix。这是志愿者和公司都参与的社区过程。这些实体并非总是共享所有工具,因此发生了单独的shell。到我们意识到这会适得其反时,统一所有使用中的外壳为时已晚。相反,已进行工作以确保所有这些外壳(理论上)彼此兼容

长答案很复杂,并且与Unix本身的历史紧密相关。它不可能完全保留在此页面上的一个答案上,但是已被广泛记录(错误)。通过浏览有关Unix历史的网络和书籍,您将找到更详细,更精确的答案。


2

存在不同的Shell的原因与存在不同的Web浏览器的原因相同:每个人都有自己的偏好,有些Shell具有历史的包g或动量。每个都有不同的功能和特质。


1

主要是历史...

Bourne是作为(专有的)SysV Unix的一部分开发的,而BSD则使用了csh...后来,bash被开发为Bourne shell(及其改进版本,如ksh)的开源替代方案。POSIX标准采用了类似Bourne的外壳。ksh兼容,bash可以兼容。

比起原始的Bourne shell(缺少命令完成等),shell喜欢csh并且tcsh更易于交互使用,但是对于脚本编写来说却很可怕 ...

在某些环境中(例如,基于Unix的嵌入式系统),脚本功能,大小和速度比命令完成之类的交互式功能更为重要,并且倾向于使用不同的Shell变体。

对于可移植脚本,应使用符合POSIX的Bourne-variant,并避免扩展。


3
-1认为世界始于SysV。在Bourne shell的发布于UNIX V7在1977年,SysV的发布前六年。
罗布2012年

@Rob,S / 1977年/ 1979年 /
斯特凡Chazelas

足够公平了……* nix的历史非常复杂...参见en.wikipedia.org/wiki/File:Unix_history-simple.svg
Gert van den Berg
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.