null
分类:
2006-01-24 14:58:04
翻译:
译者声明:译者对译文不做任何担保,译者对译文不拥有任何权利并且不负担任何责任和义务。
这是从(外部链接)的第二章提取出来的文本。
2. 历史
最初的 UNIX 系统 shell 是 Ken Thompson 在 Bell 实验室写的一个简单的程序,它作为到新的 UNIX 操作系统的接口界面。它允许用户调用简单命令,或通过把一个命令的输出经过叫做管道的一种特殊文件传递成为下一个命令的输入而把命令连接在一起。Thompson shell 被设计为一个命令解释器,而不是一门编程语言。尽管你可以把一系列的命令放置到一个文件中并运行它们,就是说,建立 shell 脚本,这里没有对传统语言设施的支持,如流控、变量和函数。在对某种流控的需要出现的时候,建立了作为单独命令的 /bin/if 和 /bin/goto 命令。 /bin/if 命令求值它的第一个参数,如果为真,则执行命令行的余下部分。/bin/goto 命令从它的标准输入读取脚本,查找指定的标签,并定位到这个位置。在 shell 从调用 /bin/goto 中返回来的时候,它从标准输入的由 /bin/goto 设定的位置读取下一行。
不像多数更早的系统,Thompson shell 命令语言是不带有任何特权的用户级别的程序。这意味着任何用户都可以建立新的 shell,这导致一连串的改进的 shell。在 1970 年代中期,John Mashey 在 Bell 实验室通过增加命令扩展了 Thompson shell,这样它就可以用作一个原始的编程语言。他为增进性能而内置了一些命令比如 if 和 goto,还增加了 shell 变量。
与此同时,Steve Bourne 在 Bell 实验室写了包括了编程语言技术的一个 shell 版本。一组丰富的结构化流控原语是这门语言的一部分;shell 通过建造一个分析树并接着执行这个树来处理命令。因为有丰富的控制流原语,这里不需要 goto 命令。Bourne 介入了"立即文档(here-document)",籍此一个文件的内容就可以直接插入到脚本中。Bourne shell 经常被忽略的贡献之一是有助于消除程序和 shell 脚本之间的区别。 shell 的早期版本从标准输入读取输入,致使不能使用 shell 脚本作为管道线的一部分。
到了 1970 年代晚期,每种 shell 在 Bell 实验室都有可观的追随者。两个 shell 是不兼容的,这导致了在对谁将成为标准 shell 上的分歧。Steve Bourne 和 John Mashey 在三次连续的 UNIX 用户组集会上争论他们各自的理由。在这些集会之间,各自增进他们的 shell 来拥有另一个中的功能。设立了一个委员会来选择标准 shell。它选择了 Bourne shell 作为标准。
在这段所谓的“shell 大战”期间,我为 Bell 实验室的一个项目工作,它需要一个表单录入系统。我们决定建造一个表单解释器,而不是为每个表单写一个单独的程序。不是去发明一个新的脚本语言,我们通过修改 Bourne shell,按需要增加内置命令来建造一个表单录入系统。整个应用程序被编码为 shell 脚本。我们增加了一个内置命令来读表单模板文件并建立 shell 变量,和一个内置命令来通过表单蒙板(mask)来输出 shell 变量。我们还增加了一个内置的命名 let 来使用 C 语言表达式语法做算术运算。增加了数组设施来处理在屏幕上的成列的数据。增加了 shell 函数来便于写模块化代码,原因是我们的脚本趋向于比当时多数 shell 脚本都大。由于 Bourne shell 是用 C 语言的一个类 Algol 变体写成的,我们在自己的版本中把它转换成使用更加标准的 K&R 版本的 C 语言。我们去除了不允许内置命令做 I/O 重定向的限制,并为了增进性能而增加了 echo、pwd 和 test 内置命令。最后,我们增加了把命令作为协进程运行的能力,这样处理用户键入数据和访问数据库的命令可以被写为单独的进程。
与此同时,California 大学 Berkeley 分校的 Bill Joy 建造了叫做 C shell 的一个新 shell。类似 Mashey shell,它被实现为一个命令解释器,而不是一门编程语言。尽管 C shell 包括流控构造、shell 变量和算术设施,他的主要贡献是更好的命令接口界面。它介入了历史列表和编辑设施的想法,这样用户就不需要重新键入他们不正确录入的命令。
当我在 Bell 实验室迁移到一个研究职位之后不久就建立了 ksh 的第一个版本。开始于这个表单脚本语言,我去除了那些特定于表单的代码,还增加了来自 C shell 的有用特征比如历史列表、别名和作业控制。
在 1982 年,UNIX System V shell 被转换到了 K&R C,echo 和 pwd 成为内置命令,增加了定义和使用 shell 函数的功能。不幸的是,System V 的函数定义语法不同于 ksh 的。为了维护与 System V shell 的兼容性并保持向后兼容,我修改了 ksh 来接受这二种语法。
ksh 流行的内嵌(inline)编辑特征(vi 和 emacs 模式)是由 Bell 实验室的软件开发者建立的;vi 行编辑模式由 Pat Sullivan 完成,emacs 行编辑模式由 Mike Veach 完成。他们各自独立的修改 Bourne shell 来增加这些特征,并且二者都在只有 ksh 拥有他们各自的内嵌编辑器的情况下才使用 ksh 的组织中。最初拒绝向 ksh 增加命令行编辑的想法是寄希望于行编辑将被转移到终端驱动程序中。但是,当明确了这是不可能马上发生的时候,这两个行编辑模式都被集成到 ksh 中并是可随意选择的,这样在提供了行编辑作为终端接口的一部分的系统上可以停用他们。
随着越来越多的 AT&T 软件开发者转移到 ksh,它成为 AT&T 事实上的标准 shell。随着开发者离开 AT&T 到别的地方,对 ksh 的需求导致 AT&T 通过 UNIX System Toolchest 使外部客户可以获得到 ksh 源代码,那是一个电子的软件发布系统。只需一次付费,任何公司都可以购买到发行无限数量的 ksh 二进制程序的权力。多数 UNIX 系统提供者利用了它,现在把 ksh 为他们系统的一部分运行。ksh 的更广泛的可获得性对它的成功做出了显著的贡献。
随着 ksh 使用的增长,对更强的功能性的需求出现了。像最初的 shell 那样,ksh 首先主要用于设立进程和处理 I/O 重定向。更新的用户要求更多的字符串处理能力来减少进程建立的数目。ksh 的 1988 年版本,是本文写作的时候最广泛发行的版本,扩展了 ksh 模式匹配能力,使之可以比拟于在 sed 和 grep 中找到的正则表达式。
尽管它是可广泛的获得的,ksh 的源代码不在公众域中。这导致了 Free Software Foundation 建立了bash、也就是“Bourne again shell”;还导致了 pdksh 的建立,它是 ksh 的公众域版本。不幸的是,它们都不与 ksh 兼容。
在 1992 年,IEEE POSIX 1003.2 和 ISO/IEC 9945-2 shell 和实用工具标准被批准了。这些标准描述了基于 UNIX System V shell 和 ksh 的 1988 年版本的一门 shell 语言。ksh 的 1993 年版本是作为 POSIX 和 ISO/IEC shell 标准的超集的 ksh 版本,它向后兼容 1988 年版本的 ksh。
awk 命令是在 1970 年代晚期由 Bell 实验室的 Al Aho、Brian Kernighan 和 Peter Weinberger 作为一门报表生成语言而开发的。在 1980 年代早期开发的第二代 awk 是更加通用的脚本语言,但是缺乏某些 shell 特征。组合 shell 和 awk 来写脚本应用是极其常见的。对于很多应用,这带有速度慢的缺点,原因是时间消耗在对 awk 的每次调用中。在 1980 年代中期由 Larry Wall 开发的 perl 语言,尝试组合 shell 和 awk 的能力到一个单一的语言中。因为 perl 是可自由的获得的并表现的比组合的 shell 和 awk 更好,perl 拥有了一个巨大的用户社区,主要是在大学中。
From: mash@mips.UUCP (John Mashey)
Newsgroups: net.unix-wizards
Subject: Re: Shell history, true facts, but long
Date: 18 Mar 86 09:05:12 GMT
应 Todd Williams 的请求:
1) 在一开始的时候,就有了 Ken Thompson 写的 shell,它就是 /bin/sh。我不记得它是在哪个版本中出现的了,它比我的时代要早,就是说,可以确定在 1973 年晚期之前,它就看起来像并担当了 shell。关于早年的详情,请参见 DMR 在第二次 UNIX BLTJ 中的论文。几乎没有内置的东西(故意的),但是有独立的 if/goto 命令。goto 通过定位同它的父 shell 共享的文件指针来工作。对于单一流的命令行解释器,多数但不是全部的基本原理(按我的观点)的想法都已经存在了。请参见引用[1]。
2) 在 1973-1976 年期间,很多人以各种各样的方式 hack 这个 shell。USG(UNIX Support Group at Murray Hill)增加了一些东西,我们做的有:
3) "PWB Shell"最初出现在 1975 年中期。它起源自我在 1975 年早期提出的一组要求和建议,为的是尝试做严肃的 shell 编程。在 1975 年中期,shell 获得了变量,包括获得自每进程数据的 3 个变量。在这里出现了更一般化的路径查找的想法。补充了某些现存的支持命令,包括 if/else/endif。多数这些工作是 Alan Glasser 或 Dick Haight 完成的。我接管了这项工作,做性能分析,把多数控制结构命令转移到 shell 中,增加了 switch、while 等等。此时有了很大数量的严肃 shell 编程。它稳定于 1976 年上中旬,尽管还有一些更多的特征在 1977 早期增加。出于多种原因它被叫做"Mashey shell",我彻底的憎恶这个术语,因为它在根本上仍是一个 Thompson shell,带有我们选定的补充和各种调整,强迫做最大的向上兼容,导致了我发现了感觉不太好的一些东西,更加感觉不太好的是后来的一个 Bell Labs 内部教程的标题: "Bourne Shell Programming for Mashey Shell Programmers"。请参见[2]和[3]。
4) Bourne shell 的工作开始于 1976 年早期或者 1975 年晚期。第一个版本是非常不同的;例如,它使用 $ 作为转义字符而不是 \。在 1976 年期间做了长时间的修改、对话、讨论,许多不同玩家不断变换着合作关系[就像游戏里的外交一样]。除了 Computing Research 全体、SRB 自己和我之外,这也是(据我回忆) Dave Korn(作为 Bourne sh 的非常早的用户和扩展者)开始介入的时间。做为总结,某些 Bourne shell 的基本原理来自 Thompson shell,而一些更加新颖。一些添加的语义,和要么来自 PWB shell、要么来自对其应该怎样的共识的一些语法,就是所有改变中的东西。[例如,环境的想法是对受限制的 PWB 变量的急需的一般化;这来自 DMR、SRB和我。] 它成为了标准 shell,但却花了 PWBer 一段时间做转换,因为他们在现存的 shell 过程中作了巨大的投入。[不包括大量用标准 V6 或更早 shell 写的那些。]请参见[4]。有一个小花絮,你知道有多少 68K 程序员跳出来诅咒 shell 使用内存故障陷入来增长它的存储吗? 我承认是我干的,我不停地拿可怜兮兮的 Bourne shell 与快速的 PWB shell 的做速度对比,从而促使 SRB 干了这件事情。
5) 我追踪了 PWB shell 对 C-shell 的确切的影响。我相信其特定部分至少演变自 PWB shell 的文档(控制命令的实现,但不总是原样的语法): if-then-else-endif、break、breakaw、onintr、while-end。问一下 Bill Joy 在哪里得到的这些东西。最后,注意到周围还有很多其他有趣和重要的 shell,但是我累了,我觉得有更多的人知晓后来的工作。
[1] K. Thompson, "The UNIX Command Language", in Structured Programming, Infotech State of the Art Report, Nicholson House, Maidenhead, Berkshire, England: Infotech International Ltd (March 1975), 375-384.
Classic Thompson-style paper of maximal insights per word, incl: "Many familiar computing 'concepts' are missing from UNIX. Files have no records. There are no access methods. User programs contain no system buffers. There are no file types. These concepts fill a much needed gap...
[2] J. R. Mashey, "Using a Command Language as a High-Level Programming Language", Proc. 2nd Int. Conf on Software Engineering, IEEE (Oct 13-15, 1976), 169-176.
Includes some usage data; state of the world in PWBland in mid-1976.
[3] T. A. Dolotta, J. R. Mashey, "Using a Command Language as the Primary Programming Tool", in Command Language Directions: Proc. IFIP Working Conference on Command Languauges, Sept 10-14, 1979, D. Beech, Ed, North- Holland, AMsterdam, 1980.
3 years later; more data; Bourne shell(called here nsh) included.
[4] S. R. Bourne, "An Introduction to the UNIX Shell", BSTJ 57, No 6, Part 2 (Jul-Aug 1978), 2797-2822
-john mashey UUCP: {decvax,ucbvax,ihnp4}!decwrl!mips!mash
DDD: 408-720-1700
USPS: MIPS Computer Systems, 930 E. Arques, Sunnyvale, CA 94086