2019年7月20日 星期六

Unix Shell

从历史角度出发,Unix shell有两大家族——Bourne Shell家族和C-shell家族,下面我们来了解:我们现在使用的Unix shell是怎样演变而来的?
1. Unix shell——Bourne Shell家族:sh, ksh, bash
shell是程序,并且像所有程序一样,它由运行它时所键入的命令的名称来标识。1971年,Unix的创建者Ken Thompson开发了最早的shell,Thompson将该shell命名为sh
在20世纪70年代,当您使用sh程序时,首先,键入用户标识和口令登录系统,一旦口令通过了验证,就开始执行各种启动过程,然后Unix为您运行sh程序。sh程序显示一个shell提示并等待输入命令。一旦输入命令,sh就执行所需的工作处理命令。一旦命令结束,sh就显示一个新的shell提示,并等待输入下一条命令。最终,您通过按下^D发送一个eof信号告诉sh程序不再输入数据了。在捕获到这个信号后,sh程序终止,并将您注销,结束工作会话。

现在,使用的shell的过程基本上与1971年相同。当然,现代的shell相比原始的sh程序,功能要强大许多。
1971年到1975年使用的第一个shell,可以称他为Thompson shell。伴随第一版Unix至第六版Unix一起发行。1975年,由John Mashey领头编写了一个新的shell。该新shell作为一个特殊版本的Unix的一部分于1976年发行。因为 Mashey shell被设计用来代替原始的shell,所以也将它命名为sh。
而且新shell与旧shell兼容,任何时间使用它们的任何一个,都不会出现任何问题。当新程序以这种方式与旧程序兼容时,我们就可以说新程序向后兼容旧程序。例如。 Mashey Shell就向后兼容原始的Thompson shell。
因为shell被设计为常规的程序,所以任何拥有足够专业知识的人都可以根据自己的爱好修改已有的shell,甚至编写自己的shell。1976年,另一位贝尔实验室程序员Steve Bourne着手开发一种全新的shell。因为开发的新shell准备替换以前Thompson shell,所以Bourne Shell也命名为sh
不管是 Mashey的shell还是Bourne 的Shell都提供了许多重要的改进,特别是在编程方面,因此在很短的时间内,两种shell就在贝尔实验室获得了众多的支持者。但是它们尽管都向后兼容已有的sh程序,但是它们彼此之间不兼容。这样就导致了一个内部争论,即哪种shell应该称为标准的Unix shell。该争论的结果很重要,它将改变未来Unix 发展的进程。
连续3届的Unix大会上,Mashey和Bourne都在讨论他们各自的shell。在大会间隔期间,他们都努力增强自己的shell,添加新的特性。最终他们选择的是Bourne 的shell。
因此,在Unix发行第7版时,Bourne shell成为成为所有Unix用户的默认shell。实际上Bourne shell非常稳定,设计特别优秀,多年以来,多年以来它一直是Unix的标准shell。有时候,还会有新版本的Borune shell发布,不过这些新的shell都保持向后兼容没并且都命名为sh。现在,Borune shell 获得了广泛的应用,所有兼容的shell,不管是旧的还是新的,都被认为是Bourne shell家族的成员。
1982年,另一名贝尔实验室的科学家David Korn创建了一种Bourne shell的替代品,称为Korn Shell或者ksh。新shell基于Korn和其他研究人员在最近今年创建的工具。这样,相对于标准的Bourne shell,新shell进行了极大的改进。特别是,新的shell提供了历史文件,命令编辑,别名以及作业控制等特性。
Korn确保ksh程序向后兼容当前的sh程序,在很短的时间内,Korn shell就称为贝尔实验室的事实标准。在Unix的下一版本发行时, Korn shell分发到世界范围,很快就永久替代了Bourne shell。从那时起,Korn shell有发行了两个主要版本:1988年的Ksh88和1993年的Ksh93。
在20世纪90年代初,大量的压力要求标准化Unix。该压力导致了两个不同的运动,其中一个由各组织和委员会控制,另一个起源于大众的需求量。每个运动都有自己解决下述问题的方法:如何一次性永久地标准化Unix的shell?
官方运动创建了一大组规范,即POSIX,POSIX是操作系统标准化的蓝图。
Korn shell不能与Linux一起发行,问题在于虽说Korn shell是Unix的一部分,但它是AT&T公司的商业产物,这样普通大众就不能使用它。
2000年,AT&T公司最终允许Korn shell成为一个开放源代码的产品,但是为时已晚。在20世纪90年代,已经创建了许多免费,开放源代码的shell,其中最重要的shell包括FreeBSD shell, Pdksh, Zsh和Bash。所有这些shell都遵循1003.2标准,从而使它们足以替换Korn shell。
FreeBSD shell是FreeBSD 默认的shell
Pdksh是Korn shell的一个现代克隆体。Pdksh编写的目的是为了提供一个没有许可限制的Korn shell,因此才命名为“Public domain Korn shell”。
Bourn shell家族的下一个重要成员是Zsh,Zsh的现状与Pdksh极为相似:它有效,稳定是一个出色的shell,但是,20世纪90年代中期开始,Zsh的发展就变得非常缓慢,几乎停滞不前。
在所有的Bourn shell家族成员中,目前最重要的shell是bash
Bash采用与Korn相似的方式扩展了基本的Bourn shell的功能。bash 不仅是一个拥有强大脚本语言的命令处理器,而且还支持命令行编辑,命令历史,目录栈,命令自动补全,文件名自动补全以及许多其他特性。
Bash是一个自由软件,由自由软件基金会发行,它是Linux以及基于Unix的Macintosh的默认shell,而且还可以在Microsoft Windows中使用(在一个类似于Unix系统的Cygwin下运行)。实际上,世界上每个重要的Unix系统或者提供Bash,或者可以从Internet上免费下载一个相应的Bash版本。基于所有这些原因,Bash是历史上最流行的shell,全世界有数百万人在用它。
名称含义:
Bash
名称bash代表“Bash-again”,所以它是一个只取首字母的缩写词,并且还是一个双关语。Bash的思想就是——无论是从字面上还是内涵上讲——Bash是一个基于标准Unix shell的复兴(born again,也就是再生)版本。

2. Unix shell——C-Shell家族:csh, tcsh 
最初的Bourn shell于1977年开始使用。1978年,Bill Joy开发了一种全新的shell,它基于Unix第6版的sh程序开发,该程序是Bourn shell的前驱。 
Joy在Unix第6版的sh程序基础上,添加了许多重要的改进,包括别名,命令历史和作业控制。另外,他还完全修补了编程工具,改变了脚本语法的设计,从而使其语法类似于C语言。基于这一原因,他称他的新shell为C-Shell,而且将程序的名称由sh改为csh。 
20世纪70年代末期,以及整个20世纪80年代,C-shell非常流行。在优秀shell倍出的年代,C-shell流行的原因有以下几个方面: 
首先,C-shell对标准Unix shell进行了重大的改进。其次,C-shell作为组成部分包含在BSD Unix的发行版中,而BSD Unix本身就非常流行。最后,C-shell是由Bill Joy创建的,而Bill Joy是最重要的Unix程序员之一。Joy的工具,包括vi编辑器,设计的相当出色,有许多人在使用。 
但是,C-shell还存在两个重要的问题。一个问题是可解决的;另一个稳日却是无法解决的,从而导致被有经验的用户放弃。 
首先,因为BSD的许可条款,C-shell不能自由的发行和修改,对许多程序员来说是一个大问题。基于这一原因,在20世纪70年代末,一名来自卡内基梅隆大学的程序员Ken Greer开始着手编写一个完全自由的csh版本,称之为tsch。在20世纪80年代初期,开发Tcsh的职责交给了由美国俄亥俄州的Paul Placeway领导的一个程序小组。 
Tsch令人惊奇。这不仅是因为它是免费的(在公共领域发行),而且因为它增强了C-shell,提供了许多高级特性,例如文件名自动补全和命令行编辑等。Tsch吸引了大量的用户,并且随着时间的流逝,吸引了大批的志愿者维护和扩展它。但是C-shell还有一个无法解决的问题:C-shell和Tsch不像Bourne家族的shell那样擅于编程。尽管类C的语法适于编写C程序,但它并并不适合于编写shell脚本,特别是涉及到I/O(输入/输出)方面的内容时,此外,C-shell和Tsch都有许多设计缺陷。 
到20世纪90年代,所有流行的shell都可以在所有的Unix系统上使用,这引起了一场关于哪个shell是最好的Unix shell的广泛争论。 
1995年,一名受人尊敬的Unix程序员,并且还是Perl编程语言之父之一的Tom Christiansen撰写了一篇广泛传播的论文,这篇论文的标题是“Csh Programming Considered Harmful”。该论文的标题来自一篇非常有名的计算机论文:“Go to Statement Considered Harmful”,一篇由荷兰程序员Edsger Dijkstra撰写的小论文。1968年Dijkstra的论文改变了编程世界,致使结构化编程开始普及。1995年Christiansen的论文,尽管没有如此重大的影响,但是却导致了人们在编程方面最终放弃了C-shell和Tsch。 
现在,C-shell和Tsch已经不像以前那样广泛了。在一些系统上,cshtsch是两个单独的程序。但是,在许多Unix系统上,tsch已经完全取代了csh。也就是说,如果运行csh,实际上得到的是tsch。通过查看csh说明书页可以辨别系统是不是这样。 
即使现在,C-shell仍然重要。实际上,当查阅其他Unix shell时,总是能够看到取自Bill Joy多年以前在C-shell中设计的特性。例如,在Zsh的网站上,上面写着:“Many of the useful features of bashksh, and tcsh were incorporated into zsh(bashkshtcsh中的许多有用的特性都已经集成在zsh中了”。 

沒有留言:

張貼留言