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

Gee*_*eek 17 shell

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

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

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

ger*_*ijk 21

因为人们有不同的需求,在特定情况下有适合您需求的替代方案是很好的。shell 本身只是一个工具,在我看来应该可以被任何其他工具替换。这就是 Unix/Linux 的力量,与 Microsoft Windows 选择的相反。

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

  • 恰恰。有人可能会问“为什么有这么多窗口管理器?” 以及。Unix 本地人可能会问相反的问题:为什么只有一个 CMD.EXE?为什么 Windows 如此僵化且不可定制? (14认同)
  • 甚至 DOS 中的`COMMAND.COM` 也是可替换的。但是,由于其他应用程序(和其他用户)的假设,您经常会得到一个非常脆弱的系统。因此,很少有 CMD.EXE 的成功替代品。一个是 PowerShell,它有微软的惯性支持。另一个例子是,奇怪的是,`bash` 得到了 Cygwin 社区的大力支持,更不用说 MinGW 的人了。至于窗口管理器,Windows 一次只有一个,但随着时间的推移,随着 Windows 环境本身的发展,出现了几个。 (3认同)

orm*_*aaj 16

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

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

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

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

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

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

  • 请注意,尽管`local` 不是 POSIX 或 Unix,但它在 Linux _standard_ (LSB) 和 [debian policy _standard_](http://www.debian.org/doc/debian-policy/ch- files.html#s-scripts)。请注意,`es` 是`rc` 的后续。 (2认同)