Shell 脚本对于任何担任系统管理员类型角色的人来说都是一项必不可少的技能,而人们今天编写脚本的主要 shell 是 Bash。Bash 作为默认 shell 出现在几乎所有 Linux 发行版和<0xC2><0xA0>现代 MacOS 版本中,并且很快将被列为 Windows 终端<0xC2><0xA0>的本机组成部分。可以说,Bash 无处不在。
那么它是如何发展到这一步的呢?本周的 Command Line Heroes 播客通过询问编写代码的人,深入探讨了这个问题。
它始于 Unix
像所有编程事物一样,我们必须追溯到 Unix。一点 shell 历史:1971 年,Ken Thompson 发布了第一个 Unix shell — Thompson shell。但是用户可以进行的脚本编写量存在严重限制。这意味着自动化以及随之而来的整个 IT 运营领域都面临严重限制。
这篇 精彩的研究文章概述了早期脚本编写尝试的挑战(粗体字是为了突出显示命令)
与 Multics 中的前身类似,这个 shell (/bin/sh) 是一个独立的用户程序,在内核之外执行。诸如 globbing(用于参数扩展的模式匹配,例如 *.txt)之类的概念是在一个名为 glob 的单独实用程序中实现的,if 命令(用于评估条件表达式)也是如此。这种分离使 shell 保持在很小的体积,不到 900 行 C 源代码。
该 shell 引入了一种紧凑的重定向语法(< > 和 >>)和管道(| 或 ^),这种语法已沿用至今。您还可以找到对调用顺序命令(使用 ;)和异步命令(使用 &)的支持。
Thompson shell 缺少的是脚本编写能力。它的唯一目的是作为交互式 shell(命令解释器)来调用命令并查看结果。
随着终端的访问权限增加,对自动化的兴趣也随之增长。
Bourne shell 是向前迈出的一步
在 Thompson 发布六年后的 1977 年,Stephen Bourne 发布了 Bourne shell,旨在解决 Thompson shell 的脚本编写限制。(自 1990 年以来 Bash 语言的主要维护者 Chet Ramey 在 Command-Line Heroes 的这一集中讨论了它)。这是贝尔实验室作为 Unix 系统一部分推出的技术的自然演变。
Bourne 打算做出哪些不同的事情?研究员 M. Jones 对此进行了很好的概述:
Bourne shell 有两个主要目标:充当命令解释器,以交互方式执行操作系统的命令,以及用于脚本编写(编写可通过 shell 调用的可重用脚本)。除了取代 Thompson shell 之外,Bourne shell 还提供了优于其前身的几个优点。Bourne 在脚本中引入了控制流、循环和变量,从而提供了一种更实用的语言来与操作系统进行交互(以交互方式和非交互方式)。该 shell 还允许您将 shell 脚本用作过滤器,从而为处理信号提供集成支持,但缺少定义函数的能力。最后,它融入了我们今天使用的许多功能,包括命令替换(使用反引号)和 HERE 文档,用于在脚本中嵌入保留的字符串文字。
Bourne 在 之前的采访中这样描述它
最初的 shell 实际上不是一种语言;它是一种记录 — 一种从文件中执行线性命令序列的方式,唯一的控制流原语是 GOTO 标签。Ken Thompson 编写的原始 shell 的这些限制非常重要。例如,您无法轻松地将命令脚本用作过滤器,因为命令文件本身就是标准输入。在过滤器中,标准输入是您从父进程继承的,而不是命令文件。
最初的 shell 很简单,但是,随着人们开始使用 Unix 进行应用程序开发和脚本编写,它就显得过于局限。它没有变量,没有控制流,并且引用功能非常不足。
对于脚本编写者来说,这个新 shell 是向前迈出的一大步,但前提是您有权访问它。
将 Bourne 的 shell 重新思考为自由软件
在那之前,主要的 shell 都是贝尔实验室拥有和运营的专有软件。如果您足够幸运,您的大学可能会访问 Unix shell。但是,这种受限制的访问远非自由软件基金会 (FSF) 想要实现的世界。
Richard Stallman 和一群志同道合的开发人员正在编写 Unix 的所有功能,并采用 GNU 许可下的免费许可。其中一位开发人员的任务是制作一个 shell。那位开发人员是 Brian Fox。他对他的任务的描述让我非常着迷。正如他在播客中所说
如此具有挑战性的原因是,我们必须忠实地模仿 Bourne shell 的所有行为,同时又允许扩展它,使其成为人们使用的更好工具。
当时人们也在讨论 shell 标准的含义。在这种历史背景和前景中的竞争下,流行的 Bourne shell 被重新构想;浴火重生。
Bourne-Again Shell
这两个催化剂 — 自由软件使命和竞争 — 将 Bourne-Again shell (Bash) 带入了生活。在当时不寻常的举动中,Fox 没有以自己的名字命名他的 shell,而是专注于从 Unix 到自由软件的演变。(虽然 Fox Shell 本可以击败 Fish shell 成为 fsh 命令 #missedopportunity)。这种命名选择似乎与他的个性相符。正如 Fox 在剧集中所说,他甚至对个人荣耀的看法都不感兴趣;他试图帮助编程文化发展。然而,他并非不屑于一个好的双关语。
很高兴听到 Bourne 并没有因为文字游戏而感到不满。Bourne 讲了一个故事,有人在一次会议上走到他面前,给了他一件 Bash T 恤。那个人是 Brian Fox。
Shell | 发布时间 | 创建者 |
---|---|---|
Thompson Shell | 1971 | Ken Thompson |
Bourne Shell | 1977 | Stephen Bourne |
Bourne-Again Shell | 1989 | Brian Fox |
随着时间的推移,Bash 的采用率不断提高。其他工程师开始使用它并提交对其设计的改进。事实上,多年后,Fox 坚持认为,学会放弃对 Bash 的控制是他一生中做的最重要的事情之一。随着 Unix 让位于 Linux 和开源软件运动,Bash 成为开源世界中的关键脚本编写力量。伟大的项目似乎超越了个人愿景的范围而发展壮大。
我们可以从 shell 中学到什么?
shell 是一项与日常笔记本电脑使用如此紧密相关的技术,以至于很容易忘记它需要发明。从 Thompson shell 到 Bourne shell 再到 Bash shell 的故事,得出了一些熟悉的结论
- 有动力的个人可以在正确的使命下取得巨大进步。
- 我们今天依赖的大部分内容都建立在我们行业中仍然健在的传奇人物的工作之上。
- 倾向于生存下来的软件是那些超越其原始创建者愿景而发展的软件。
Command Line Heroes 已经涵盖了第 3 季的所有编程语言,并且即将迎来尾声。请务必订阅以了解您想了解的有关编程语言起源的一切,我很乐意在下面的评论中听到您的 shell 故事。
2 条评论