Bourne Shell 脚本/比较 Shell
几乎所有像这样的书籍都会有一节专门介绍(或者非常类似于)“为什么你应该使用这本介绍的 shell/程序风格/语言/等,而不是其他执行相同任务但略有不同的其他 shell/程序风格/语言/等”。这似乎是强制性的。
然而,这本书不会这样做。我们当然会谈谈“为什么选择 Bourne Shell”。但你很快就会发现,这并不排除其他 Shell。正如我们将在下面进一步解释的那样,没有充分的理由不使用其他 Shell。
如今,有许多 Unix 命令 Shell 可供使用。Bourne Shell 只是这片浩瀚海洋中的一滴水。所有这些 Shell 之间是什么关系?它们的功能相同吗?哪一个更好?让我们看看什么是 Shell,以及这对所有不同的 Shell 意味着什么。
自 20 世纪 70 年代 Unix 操作系统诞生以来,它对世界的看法一直很独特。它与大多数其他操作系统截然不同,因为它的重点始终是 *高级用户*: 那些希望从系统中榨取每一滴性能并具备相应技术知识的人。Unix 被设计成可以根据用户的需求进行编程和修改。从本质上讲,Unix 没有用户界面;相反,它由一个稳定的操作系统内核和一个通用的 C 库组成。如果你不是想进行真正的硬核编程,而是想完成日常任务(甚至只是想快速编写一个小程序),纯粹的 Unix 会让人非常头疼。
换句话说,从一开始就清楚地知道需要一个工具,让用户可以使用编码库和内核提供的功能,而无需进行真正的编程工作。换句话说,一个可以快速轻松地将小命令传递到较低级别系统的工具。无需编译器或其他花哨的编辑器,但能够利用底层系统强大的功能。Stephen Bourne 承担了这项任务,并想出了他称之为 *shell* 的东西:一个小型、即时编译器,它可以一次接收一个命令,将其翻译成机器可以理解的位序列,并执行该命令。现在我们把这种类型的程序称为 解释器,但在当时,“shell”这个词更为常见(因为它对用户来说是底层系统的 shell)。Stephen 的 Shell 很精简、很快,尽管有时有点笨拙,但它的强大功能至今仍让许多当前的操作系统命令行界面望尘莫及。由于它是 Stephen Bourne 设计的,这个 Shell 被称为 Bourne Shell。可执行文件简单地称为 *sh*,这种 Shell 在脚本编写中的使用仍然非常普遍,以至于地球上没有一个基于 Unix 的系统不提供一个可执行文件名为 sh 的 Shell。
当然,每个人都是批评家。Bourne Shell 被广泛使用(实际上,它仍然在使用),因此它成为 Unix Shell 中的实际标准。但几乎所有的人都立即(以及随着使用)想要在 Shell 中添加新功能,或者想要一种更熟悉的方式来表达命令,或者其他一些东西。许多人创建了他们认为在 Bourne Shell 基础上发展的新 Shell。有些与 Bourne Shell 完全兼容,有些则不那么兼容。一些变得很有名,另一些则失败了。但几乎所有这些 Shell 都对 Bourne Shell 抱有深情,他们称之为“爸爸……”
这些 Shell 中的许多可以以 sh 类似模式运行,更密切地模仿最原始的 sh,尽管大多数人倾向于以默认模式运行它们的 Shell,这比最小的 sh 提供了更多功能。
所以有很多 Shell 可用,但你能在任何地方找到 Bourne Shell,对吗?老式的 *sh*,一直忠实地坐到世界末日……
嗯,不,不完全是。现在大多数 sh 可执行文件实际上已经不再是 Bourne Shell 了。通过 Unix 中一项名为链接的魔法(它允许一个文件伪装成另一个文件),你在任何 Unix 系统上找到的 sh 可执行文件很可能实际上是基于 Bourne Shell 的 Shell 之一。如今,最常用的 Shell 之一是(随着 GNU 和 Linux 等免费和开源操作系统的兴起)由自由软件基金会生产的 Bourne Shell 的高度扩展形式,称为 Bash。不过,Bash 并没有忘记它的根源:它代表了 **B**ourne **A**gain **SH**ell。
另一个后代 Shell 代表其祖先的例子是 Korn Shell (ksh)。它也是一个扩展 Shell,与 sh 完全兼容——它只是添加了一些功能。zsh 也差不多。
最后,C Shell (csh) 及其后代 tcsh(在 BSD 系统上是原生的)形成了一个略有不同的类别。这些 Shell 在一定程度上打破了兼容性,在许多命令中使用不同的语法。使用这些 Shell 作为标准 Shell 的系统通常会提供一个真正的 Bourne Shell 可执行文件来运行通用的 Bourne Shell 脚本。
阅读了上述内容后,你会明白为什么这本书不需要说服你使用 Bourne Shell 而不是其他任何 Shell:在大多数情况下,没有明显的区别。Bourne Shell 及其遗产已深深根植于 Unix 环境的精髓之中,因此当你使用任何可用的 Shell 时,你实际上就是在使用 Bourne Shell。
所以只剩下一个真正的问题:既然你现在拥有了自己的 Unix 系统,有了自己的 Shell 和所有功能,是否有什么真正的理由使用 Bourne Shell 而不是使用 Shell 的全部功能呢?
嗯,这取决于情况。可能没有。在大多数情况下,你 *确实* 在使用 Bourne Shell,因为你使用了 Shell 的全部潜力——你的 Shell 很可能 *非常* 类似于 Bourne Shell。但有一件事你可能要牢记在心:你可能有一天想编写一个想要传递给其他人的脚本。当然,你可以使用 Shell 提供的所有选项来编写你的脚本;但这可能不适用于其他机器上的其他 Shell。这就是 Bourne Shell 作为 Unix 命令 Shell 的 通用语 的作用——也是了解如何编写专门针对 Bourne Shell 的脚本非常有用的地方。如果你为 Bourne Shell 编写脚本,并且只为 Bourne Shell 编写脚本,那么你的脚本直接从邮件附件中运行(别告诉我你还在用箱子装东西——拜托,跟上时代)的可能性远远大于其他任何命令 Shell。