Shell演义之前世今生篇

作者:何晓龙
一、Shell 的前世- 群雄并起
    Unix 以及类Unix 系统中,大家经常要使用Shell ,它的起源可以追溯到操作系统的鼻祖-UNIX 1969 年,AT&T 贝尔实验室的Ken Thompson 开始利用一台闲置的 PDP-7 计算机开发了一种多用户,多任务操作系统, Ken Thompson 照片如图1 所示。

1 Unix 之父Ken Thompson( 大胡子)
    过了不久,Dennis Richie 也加入了这个项目,在他们共同努力下UNIX 诞生了,Ken Thompson Dennis Richie 的照片如图2

2 Ken Thompson Dennis Richie 合作开发
        在他们的开发过程中,Dennis Richie 吸取了更早的麻省理工学院一个名为MULTICS 操作系统项目失败的教训,将这个操作系统命名为UNIX 。早期UNIX 是用汇编语言编写的,但从其第三个版本开始,他们为了提高系统的可移植性和开发效率,为UNIX 专门开发了一种崭新的编程语言C ,并用C 语言重新编写大部分代码。
        通过这次重新编写,UNIX 得以移植到更为强大的DEC PDP-11/45 11/70 计算机上运行。在UNIX 发展早期,其源代码是公开的,并且开发文档也十分详细,所有这些都为人们进行研究提供了方便,UNIX 很快成为当时欧美各大高校讲解操作系统的蓝本,所以UNIX 很快成为当时校园流行的操作系统。不仅如此,加州大学伯克利分校还根据UNIX 源代码,开发出了大名鼎鼎的BSD ,这是UNIX 的一个最著名的变种。不过好景不长,从UNIX Version 7 开始,AT&T UNIX 商业化,更换了许可协议,不再允许先前自由开放的做法。
        与此同时,第一个重要的标准UNIX Shell 1979 年末在Version 7 UNIX 环境推出,并以作者Stephen Bourne 的名字命名,叫做Bourne Shell (简称为sh )。Bourne Shell 是基于另一种叫做Algol 的语言。比较有意思的是,Bourne Shell 当时主要用于系统管理任务的自动化。此后,Bourne Shell 凭借其简单和高速而广受欢迎,很快就成为流行的Shell 。当然,Bourne Shell 也有不少缺点,如缺少一些交互的功能,如命令作业控制、历史和别名等。
          而在这时 AT&T UNIX 的一个著名分支BSD Unix 也悄然兴起,随着风头正劲的BSD ,另一个老牌Shell 也粉墨登场,它就是加州大学Berkeley 分校于20 世纪70 年代末开发,作为2BSD UNIX 系统的一部分发布的C Shell (简称为csh )。它的主要开发者是Bill Joy Bill Joy 被誉为软件爱迪生, 前任 Sun 的首席科学家,当年在 Berkeley 时主持开发了最早版本的 BSD Bill Joy 的照片如图 3

3 软件爱迪生 Bill Joy
        C Shell 提供了很多标准的Bourne Shell 不具备的功能。C shell 基于C 语言,作为编程语言使用时,语法也类似于C ,所以程序员可能会很喜欢它。此外,C Shell 还提供了增强交互使用的功能,如作业控制、命令行历史和别名等。当然,C Shell 的缺点和其优点一样明显,由于它是为大型机设计并增加了很多新功能,所以,C shell 在小型机器上运行可能比较慢。跟为麻烦的是,即使在大型机上,C Shell 的速度也不如Bourne Shell ,而这个问题,在当时的硬件条件下可以说是致命弱点了。
        C Shell 之后又出现了TC Shell ,它是C Shell 的扩展版本,且具有完全兼容性。新增的功能包括:命令行编辑( vi) 、历史清单的滚动、高级的文件名功能、变量和命令补全、拼写纠错、作业调度、账户自动上锁和注销、历史清单中增加时间戳等。新增的功能确实很多。
        人们经常会问“TC shell 中的T 到底代表什么含义呢?”这就要涉及到一段历史。1976 年,DEC 发布了一种新的虚拟内存操作系统——TOPS-20 ,这种操作系统基于 TENEX ,可以被美国国内的多个研究人员同时使用。TOPS-20 最显著的特点是“遗忘识别”,也称为“命令补全”,用户可以借助Esc 键获取大多数的命令或助记符,从而使得系统能正常运行。TC shell 的创建者受到TENEX/TOPS-20 的这个功能以及其他功能的影响,开发了csh 的一种版本,并模仿TENEX 的名称,将这种shell 称为TENEX C shell ,简称为TC shell tc-shell tcsh
          这样,Bourne Shell C Shell 共存的格局形成了,使得当时的UNIX 用户有了选择的权利,有了选择就会有争议,两大主流Shell 即丰富了用户的选项,同时也导致了很长一段时间内,人们对哪个Shell 更好的争论。就这样,时间到了20 世纪80 年代中期,AT&T David Korn 推出了Korn Shell (简称为ksh )。Korn Shell 1986 年发布,并在1988 UNIX SVR4 版本发布时正式成为它的一部分。
        Korn Shell 其实是Bourne shell 的一个扩展集,它提供了对Bourne shell 的向上兼容性,并且融入入了许多C Shell 中受大家欢迎的功能,在兼收并蓄的同时,并没有牺牲速度和效率,恰恰相反,Korn Shell 本身很快速和高效。Korn Shell 经历了许多版本,虽然1993 版正逐渐流行,目前用得最广泛的还是1988 , 时至今日,Korn Shell 几乎是多数Unix 的标准Shell
         Korn Shell 推出后,又出现了Z Shell(zsh) ,它是Korn Shell 的克隆版,集成了TC shell 的一些功能。Z shell 的作者是Paul Falsted ,大家可以从网上免费获的。
二、Shell 的今生- 重归一统
        Shell 发展到今天,几乎没有什么悬念了,主要是受到图形界面(GUI )技术兴起冲击,大家操作计算机的方式也发生了质的改变,文字界面由主流变为辅助。在Unix 领域,是Korn Shell 的天下,而在Linux 的地盘,则是Bash 一统江山,Bash Bourne Again Shell 的缩写,自由软件基金会于开发出Bash, 它的设计符合了IEEE POSIX P1003.2/ISO 9945.2 Shell 和工具标准。
       Bourne Again shell 诞生于1988 1 10 日,作者是Brian Fox ,后来由Chet Ramey 对它进行维护、加强以及修改Bug Bash 的第一个版本是0.99 。现在的版本( 到目前为止的) 2.05 版,它主要是对2.0 版本进行了加强, 大家要知道自己使用的是哪个Bash 版本,可以使用Bash 的“-- version ”选项来查看,图4 Ubuntu 中使用的Bash 版本。

4 Ubuntu 7.10 默认Bash 版本
         下面来谈一下Bash 的突出特点,主要表现在交互和编程两方面,Bash 都提供了很多Bourne Shell 没有的功能,当然,原来在Bourne Shell 下编写的脚本无需修改就可以在Bash 下运行。Bash 融合了C shell Korn shell 最有用的功能。Bash Bourne Shell 的改进包括:命令行历史与编辑、作业控制、函数、别名、数组、整数运算( 底数可以是2~64) ,以及Korn Shell 的一些功能,如扩展的元字符,用于生成菜单的select 循环和let 命令等。
    
原创作品,欢迎转载,但请务必遵循保留如下声明:
本原创作品采用 知识共享署名- 相同方式共享 3.0 许可协议 进行许可。
转载请注明 作者:何晓龙, 出处: [url]www.UbuntuChina.com[/url]
原始链接: [url]http://www.ubuntuchina.com/viewthread.php?tid=1703&extra=page%3D1[/url]