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命令等。
原创作品,欢迎转载,但请务必遵循保留如下声明: