为什么Unix类系统中会有多个shell?

为什么Unix类系统中会有多个shell?

标签列表为什么Unix类系统中会有多个shell?shell16我刚开始学习Unix的基础知识,对于为什么在类Unix系统中有这么多Shell感到好奇。根据Advanced programing in Unix Environment一书的介绍:

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

接下来,该书列举了一系列的Shell程序,如Bourne Shell、Bourne-again Shell、Cshell等等。我的问题基本上就是为什么我们需要多个Shell呢?

- Geek34同样的原因也适用于其他各种技术的标准。http://xkcd.com/927/ - Dan Is Fiddling By Firelight1出于同样的原因,你可以拥有适用于多种编程语言的编译器/解释器(或者一个语言的多个编译器),或者多个互联网浏览器。 - Mischa Arefiev6你的问题有些傲慢。"为什么我们需要多个外壳?"谁告诉你我们需要多个外壳?你的书说我们有多个外壳。这并不是同一回事。 - Rob5个回答20因为人们有不同的需求,在特定情况下有合适自己需求的选择是好事。在我看来,shell只是一个工具,可以被任何其他替代。这就是Unix/Linux的优势,与微软Windows所选择的相反。

同样地...为什么会有这么多文本编辑器?如果已经有一个浏览器,为什么还要开发一个新的浏览器呢?为什么会有GNOME、KDE、Xfce、LXDE、E17等桌面环境存在呢?

- gertvdijk414确实。一个人可能会问“为什么有这么多窗口管理器?”同样,一个Unix原生用户可能会问相反的问题:为什么只有一个CMD.EXE?为什么Windows如此僵化而且不可定制? - user7321@BruceEdiger 你是什么意思,只有一个cmd.exe?如果你想使用其他替代品,还有其他选择。甚至微软自己也有PowerShell作为替代方案。 - Malcolm3即使在DOS中,COMMAND.COM也是可以被替代的。然而,由于其他应用程序(和其他用户)的假设,你经常会得到一个非常脆弱的系统。因此,很少有成功的CMD.EXE替代品。其中一个是PowerShell,它得到了微软的支持。另一个例子是bash,令人惊讶的是,它得到了Cygwin社区的良好支持,更不用说MinGW团队了。至于窗口管理器,Windows一次只能有一个,但随着Windows环境本身的演变,随着时间推移,出现了几个不同的窗口管理器。 - RBerteig这个答案真棒!我觉得这就是为什么我们有那么多不同的UNIX变种:AIX、HP-UX、Solaris、Tru64、IRIX、UnixWare、OS X、Linux、FreeBSD、NetBSD、OpenBSD,等等,应有尽有! - tonga回答链接16大多数在现代UNIX环境中使用的shell都是为了符合POSIX sh规范。POSIX sh源自原始的Korn shell(ksh88),而ksh88又源自早期的Bourne shell,但是POSIX sh只规定了ksh88功能的一个小子集。一个仅实现最低要求的shell缺少许多编写安全和合理脚本所需的功能。例如,局部变量和数组都是非标准的额外功能。

因此,第一个原因是通过额外功能扩展shell。不同的shell选择关注不同的事物。例如,Zsh专注于高级交互功能,而ksh93(当前的“原始”korn shell)则专注于强大的编程功能和性能。即使是非常简化的shell,如Dash,也至少添加了一些非标准的额外功能,如局部变量。

额外功能很少具有广泛的互操作性,如果有的话。大多数ksh88的功能集相当互操作,例如扩展的globbing语法,但对于非标准功能,没有任何保证,您必须真正知道如何以可移植的方式使用它们。

第二个原因是遗留问题。仍然有很多专有的Unix系统使用古老的非标准实现作为它们的/bin/sh。直到最近,Solaris仍然使用Bourne作为默认shell,并选择维护Heirloom shell而不是升级到现代化的东西。这些系统通常带有不同的shell供您切换,例如通过更改PATH变量或修改单个脚本中的shebang。

所以总结一下。通常会有多个shell:

- 用于提供额外功能,特别是处理非可移植的附加功能。

- 用于处理经常未维护的遗留脚本。

- 大小/性能。嵌入式系统通常需要像mksh或busybox sh这样的小型shell。

- 许可原因。AT&T ksh在2000年左右之前是专有软件。这主要导致了诸如Zsh和Bash之类的ksh克隆的出现。

- 其他历史原因。虽然今天并不太流行,但曾经有过对语言进行彻底重新设计的尝试,比如scsh和es。许多shell的进程替换功能最初来自rc(具有稍微不同的语法),大括号扩展则来自csh。不同的shell具有不同组合的此类功能,通常存在一些微妙或不太微妙的差异。

- ormaaj22请注意,尽管local不是POSIX或Unix的一部分,但它在Linux标准(LSB)和Debian政策标准中被指定并要求使用。请注意,es是对rc的后续操作。 - Stéphane Chazelas1现在的mksh最初是公共领域的Bourne Shell,也是出于许可证原因而编写的。(这些问题仍然存在-许可证、可移植性和大小是我说服Google将mksh与Android一起发布的三个因素。) - mirabilos回答链接4由于一个奇怪的许可历史,没有一个单一实体开发了Unix。这是一个社区过程,志愿者和公司都参与其中。这些实体并不总是共享他们的工具,所以出现了不同的shell。当我们意识到这样做是多么低效时,统一所有正在使用的shell已经太迟了。相反,我们已经努力确保所有这些shell在理论上是彼此兼容的。

长答案与Unix本身的历史密切相关且复杂。在这个页面上无法给出一个单一的答案,但它已经被广泛(误)记录。通过在网络上搜索和阅读处理Unix历史的书籍,您可以找到更详细和准确的答案。

- rahmu回答链接2不同的Shell存在的原因与不同的Web浏览器存在的原因相同:每个人都有自己的喜好,并且一些Shell具有历史包袱或动力。每个Shell都有不同的功能和特点。

- dotancohen回答链接1大多数情况下,历史上...

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

像csh和tcsh这样的shell在交互使用方面比原始的Bourne shell更容易使用(缺乏命令补全等功能),但对于脚本编写来说却很糟糕...

在某些环境中,例如基于Unix的嵌入式系统,脚本功能、大小和速度比命令补全等交互功能更重要,因此会使用不同变种的shell。

对于可移植的脚本编写,应该使用符合POSIX标准的Bourne变种,并避免使用扩展功能。

- Gert van den Berg33-1 是因为认为世界始于 SysV。Bourne shell 在 1977 年的 UNIX v7 中发布,比 SysV 发布早了六年。 - Rob@Rob,s/1977/1979/ - Stéphane Chazelas公平的... *nix的历史非常复杂...

请参阅https://en.wikipedia.org/wiki/File:Unix_history-simple.svg - Gert van den Berg回答链接相关问题7 文件系统更改的事务性UNIX shell6 为什么在Shell(Bash)中应该优先使用“字符类”而不是“字符范围”?3 FreeBSD不是Unix,但它是类Unix的操作系统。那么主要的Unix在哪里可以阅读源代码呢?4 在Unix shell中打印后覆盖行6 Unix shell中的">"模式退出43 Unix Bourne Shell中的数组4 现代类Unix操作系统中是否有任何无法处理具有非常长行的文本文件的shell实用程序?© 2023 根据CC BY-SA 4.0 许可证授权京ICP备19056307号-1

💎 相关推荐

《饥荒》贝棒和贻贝岩功能详解
365体育官网 客户端

《饥荒》贝棒和贻贝岩功能详解

📅 07-19 👁️ 8383
轮胎蜡和轮胎釉的区别是什么?
365heart

轮胎蜡和轮胎釉的区别是什么?

📅 07-05 👁️ 6616