1700436541
UNIX传奇:历史与回忆 第5章 第7版(1976—1979)
1700436542
1700436543
“正是从第7版开始,系统才逐渐成熟,走出了象牙塔。第7版是第一个可移植版本,Unix从此核爆炸般地移植到了无数类型硬件上。因此,第7版的历史是所有Unix系统共同传承的一部分。”
1700436544
1700436545
——道格·麦基尔罗伊,《科研版Unix读本》
1700436546
1700436547
(A Research Unix Reader: Annotated Excerpts
1700436548
1700436549
from the Programmer’s Manual[1]),1986年
1700436550
1700436551
第6版Unix的各种内置工具让编程变得有趣而高效,非常适宜用来开发软件。有些工具在第6版之前就已到位,而其他工具则后来才出现。在本章中,我们将看到,第6版发布后将近4年,1127中心软件开发的几条线索在1979年1月发布的第7版中达到了高潮。
1700436552
1700436553
从逻辑和时间顺序上来说,部分内容应该放到下一章。下一章将讲述Unix在1127中心之外的传播。但如果我先讲第7版,故事似乎更有延续性。正如前文引述道格·麦基尔罗伊的评价,所有Unix系统共享的大部分传承来源于第7版。
1700436554
1700436555
Unix推动了好几种有影响力的语言的传播,本章内容也将紧贴这个主题。这些语言中,有些针对传统编程,有些用于特别目的或特定领域,还有一些是声明式规格说明语言(declarative specification languages)。我可能会花更多笔墨来讨论这个话题,虽然很多读者可能不太关心,但这是我多年以来的兴趣所在。我会尽量在每一节的开头部分讨论重要话题,这样你就可以略过后面部分。
1700436556
1700436557
另外值得注意的是,在Unix的初期,第6版是严格意义上的PDP-11操作系统。到了1979年,第7版发展为可移植的操作系统,它能够在起码4种处理器上运行,其中DEC VAX-11/780最为普遍。关于可移植性,下一章会有更多内容。最重要的是要看到,Unix悄悄地从PDP-11系统演化成了相对独立于特定硬件的系统。
1700436558
1700436559
1700436560
1700436561
1700436563
UNIX传奇:历史与回忆 5.1 伯恩的shell
1700436564
1700436565
利用第6版shell中的I/O重定向和管道,很容易就能将程序组合起来做一些任务,最初的做法是输入一连串命令,将它们汇集在一个文件(shell脚本)中,这样就可以作为单条命令来执行了。
1700436566
1700436567
第6版shell提供了用于按条件执行命令的if语句,用于跳转到脚本文件另一行的goto语句,还有在脚本中标记出某一行的方法(“
:”命令,什么都不做),带这个标记的行可以作为跳转执行目标。有了这些命令,就能实现循环操作,所以原则上第6版shell可以用来写复杂的脚本。然而,在实践中,这些机制既笨拙又脆弱。
1700436568
1700436569
正如我在下一章中会提到的那样,程序员工作台(Programmer’s Workbench,PWB[2])小组的成员约翰·马希往第6版shell中增加了一些自定义功能,使其更适合编程。这些功能包括:用于测试条件的if-then-else语句,用于循环的while语句,以及用于在shell文件中存储信息的变量。
1700436570
1700436571
1976年,刚刚加入1127中心的史蒂夫·伯恩(Steve Bourne)编写了一个新shell。它融合PWB shell的功能,同时还有其他重大改进。他的目标是保留现有shell易于交互的优点,同时也使其成为一种完全可编程的脚本语言。史蒂夫的shell提供了控制流结构,包括if-then-else、while、for和case。它还支持变量,其中一些变量由shell定义,另一些变量则可以由用户定义。引用机制[3]也得到了加强。最后,我们把它改得像其他程序一样能够成为管道执行流程中的过滤器。结果,伯恩的shell程序(被简称为sh)很快取代了第6版shell。
1700436572
1700436573
新shell的控制流语法基于史蒂夫喜欢的ALGOL 68语言,但1127中心并没有很多人喜欢ALGOL 68。例如,ALGOL 68使用单词的字符反转形式作为终止符,如fi终止if,esac终止case。但由于od已被占用(八进制转储命令),所以do的终止符是done。
1700436574
1700436575
for i in $* loop over all argumentsdo if grep something $i then echo found something in $i else echo something not found in $i fidone
1700436576
1700436577
1700436578
1700436579
1700436580
1700436581
if和while语句用程序返回的状态作为判断条件,也就是程序可以借返回数值来汇报执行情况,如程序是否正常工作。这种处理方式当时还很罕见,所以大多数程序的返回值都轻率随意。史蒂夫安排shell在每次程序没有返回合理状态时输出一条恼人的消息。程序自动“话痨”持续一周之后,大多数程序都升级了,开始返回有意义的状态值。
1700436582
1700436583
史蒂夫的shell还大大丰富了I/O重定向功能。第6版shell手册的“缺陷”一节上说“无法重定向诊断性输出”。史蒂夫的shell将标准错误流(默认情况下是文件描述符2)和标准输出(文件描述符1)分开,这样脚本的输出就可以直接指向一个文件,而错误信息则去了别的地方,通常是终端。这个新特性特别有用。
1700436584
1700436585
prog >file # stdout to file, stderr to terminalprog 2>err # stdout to terminal, stderr to errprog 1>file 2>err # stdout to file, stderr to errprog >file 2>&1 # merge stderr with stdout
1700436586
1700436587
1700436588
1700436589
[
上一页 ]
[ :1.70043654e+09 ]
[
下一页 ]