我刚刚开始学习Unix的基础知识,并且想知道为什么在类似Unix的系统中有那么多shell。摘自《Unix环境中的高级编程》一书:
Shell是一个命令行解释器,它读取用户输入并执行命令。用户对Shell的输入通常是从终端(交互式Shell)或有时是从文件(称为Shell脚本)输入的。
然后,本书继续列出了一些shell程序,例如Bourne shell,Bourne-again shell,Cshell等。我的问题基本上是为什么我们需要多个外壳?
我刚刚开始学习Unix的基础知识,并且想知道为什么在类似Unix的系统中有那么多shell。摘自《Unix环境中的高级编程》一书:
Shell是一个命令行解释器,它读取用户输入并执行命令。用户对Shell的输入通常是从终端(交互式Shell)或有时是从文件(称为Shell脚本)输入的。
然后,本书继续列出了一些shell程序,例如Bourne shell,Bourne-again shell,Cshell等。我的问题基本上是为什么我们需要多个外壳?
Answers:
现代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
起源于Public Domain Bourne Shell,它也是出于许可原因而编写的。(这些问题仍然存在-许可,可移植性和规模是帮助我说服Google将mksh包含在Android中的三个因素。)
因为人们有不同的需求,所以在给定情况下最好有其他替代方法来满足您的需求。Shell本身只是一个工具,我认为应该可以用其他任何工具替换。这就是Unix / Linux的功能,与Microsoft Windows选择的功能相反。
同样...为什么会有这么多的文本编辑器?人们为什么要开发新的浏览器(如果已有的话)?为什么会有GNOME,KDE,Xfce,LXDE,E17等?
COMMAND.COM
在DOS中也可以替换。但是,由于其他应用程序(和其他用户)的假设,您通常会获得非常脆弱的系统。结果,几乎没有成功的替代方法CMD.EXE
。一种是PowerShell,它具有Microsoft支持的惯性。另一个例子很奇怪,bash
这是由于Cygwin社区的良好支持,更不用说MinGW了。至于窗口管理器,Windows一次只能有一个,但是随着时间的推移,随着Windows环境本身的发展,已经有了多个。
主要是历史...
Bourne是作为(专有的)SysV Unix的一部分开发的,而BSD则使用了csh
...后来,bash被开发为Bourne shell(及其改进版本,如ksh)的开源替代方案。POSIX标准采用了类似Bourne的外壳。ksh兼容,bash可以兼容。
比起原始的Bourne shell(缺少命令完成等),shell喜欢csh
并且tcsh
更易于交互使用,但是对于脚本编写来说却很可怕 ...
在某些环境中(例如,基于Unix的嵌入式系统),脚本功能,大小和速度比命令完成之类的交互式功能更为重要,并且倾向于使用不同的Shell变体。
对于可移植脚本,应使用符合POSIX的Bourne-variant,并避免扩展。