UNIX shell范例精解
1.1  UNIXLinux及其历史
在学习shell时,我们发现shell通常与UNIX/Linux操作系统的不同版本相关联。例如,BourneKorn shell经常与AT&T UNIX关联,C shellBerkeley UNIX关联,而Bash shellLinux关联。在详细讨论shell之前,我们首先简单概述shell所驻留的操作系统的背景知识。
1.1.1  UNIX简介
UNIX是一个多用户、多任务的操作系统。最初由AT&T贝尔实验室的Ken Thompson1969年开发成功。UNIX当初设计的目标是允许大量程序员同时访问计算机,共享它的资源。它非常简单但是功能强大、通用并且可移植。可以运行在从微机到超级小型计算机以及大型机上。
UNIX系统的心脏是内核:一个系统引导时加载的程序。内核用于与硬件设备打交道,调度任务,管理内存和辅存。正是由于UNIX系统这种精炼特性,众多小而简单的工具和实用程序被开发出来。因为这些工具(命令)能够很容易地组合起来执行多种大型的任务,所以UNIX迅速
流行起来。其中最重要的工具之一就是shell,一个让用户能够与操作系统沟通的程序。本书将剖析当今最主流shell的特性。
最初UNIX被科学研究机构和大学采用,其费用微不足道。后来慢慢扩展到计算机公司、政府机构和制造业领域。1973年,美国国防部高级研究计划署(Defense Advanced Research Projects AgencyDARPA)启动一项计划,研究使用UNIX将跨越多个网络的计算机透明地连接在一起的方式。这个计划和从该研究中形成的网络系统,导致了Internet的诞生!
20世纪70年代后期,许多在大学期间接触并体验过UNIX的学生投身工业界并要求工业界向UNIX转换,声称它是最适合复杂编程环境的操作系统。很快大量或大或小的厂家,开始开发他们自己的UNIX版本,在自己的计算机体系结构上对它进行优化,以期占领市场。最著名的两个UNIX版本是AT&TSystem VBSD UNIX。后者源于AT&T版本,由加州大学伯克力分校于20世纪80年代早期开发成功。
面对如此众多版本的UNIX (有一个图表列出了80多个UNIX版本,访问www.ugu/ sui/ugu/show?ugu.flavors),如果不花费时间和精力考虑兼容问题,则在一个系统上能够正常运行的应用程序和工具可能无法在另一个系统上工作。由于缺乏统一的标准,许多厂家
放弃了UNIX转而使用比较古老的非UNIX专用系统,如VMS,它们被证明是更加一致和可靠的。
统一UNIX标准的时候到了。一些厂商发起并启用了开放式系统(open system)”的概念。以此为基础参与的厂商在遵循某个标准与规范上达成了一致。UNIX被选为建立新概念的基础,并成立了X/Open公司负责定义开放操作系统平台,许多组织开始使用X/Open作为系统定义的基础。X/Open现在是开放组(The Open Group)的一部分,还会继续开发单一的UNIX规范。
1993年初,AT&T将它的UNIX系统实验室出售给了Novell1995Novell将它的UNIX商标权和规范(后来变成了单一UNIX规范)转让给The Open Group,将UNIX系统源代码卖给了SCO。当今有很多公司都在出售基于UNIX的系统,包括Sun MicrosystemsSolarisHP-UX和来自Hewlett-PackardTru64 UNIX以及来自IBMshell代码AIX。除此之外,还有许多免费的UNIX和与UNIX兼容的工具,如LinuxFreeBSDNetBSD
1.1.2  为什么选择Linux
1991年,芬兰的一个大学生Linus Torvalds在芬兰的赫尔辛基大学开发了一个与UNIX兼容的操作系统内核,它被设计成为PC上的UNIX。尽管Linux模仿UNIX System VBSD UNIX,但它并未采用有版权的源代码,而是由一来自世界各地的非正式结盟的开发人员通过互联网独立开发的。
对很多人来说,Linux提供了UNIXWindows操作系统之外的另一种选择。Linux文化通过赞助联盟、大会、expos软件、新闻组和出版物已经得到了很大的发展,它引领着一场挑战PC世界中Windows统治地位的新革命。在众多系统程序员和开发人员的帮助下,Linux成为了当今与UNIX兼容的独挡一面的操作系统,拥有超过两千万的用户。当前功能最全面的内核是2.6版本(发布于200311),并且还在继续进行开发。有很多商业或非商业组织,如Red HatSlackwareMandrakeTurboSuSE Linux,发行了各种增强了操作系统内核功能的Linux发行版。
您可能已经注意到总有一个企鹅与Linux联系在一起。企鹅是Linux官方吉祥物,名为Tux,它是由Linus Torvalds选择的,以此反映他与Linux操作系统的关系。
免费软件基金会  1992年,自由软件基金会将它的GNU(GNU’s Not UNIX)软件加入到Linux
内核中以使其成为一个完整的操作系统,同时将Linux源代码置于它的通用公共许可证(General Public LicenseGPL)之下,从而使任何人都可以得到它。自由软件基金会提供了数以百计的GNU工具,包括对标准UNIX Bourne shell的改进。
GNU工具,如grepsedgawk,与UNIX上和它们同名的工具类似,但它们已改进且与POSIX①兼容。在安装Linux时,会用到GNU shell和工具,而非标准的UNIX shell及工具。如果你用的是传统的UNIX系统,例如Sun公司的Solaris 5.9,也可以使用许多这类工具,包括GNU shell
1.2  shell的定义与功能
shell是一种特殊的程序。如图1-1所示,它是用户与UNIX/Linux系统心脏(一个称作内核的程序)之间的接口。内核在系统引导时载入内存,管理系统直至关机。它创建和控制进程,管理内存、文件系统和通信等。内核以外的所有其他程序(包括shell程序)都保存在磁盘上。内核将这些程序加载到内存中运行,并在它们终止后清理系统。shell是一个工具程序,在用户登录后系统启动。它解释并运行由命令行或脚本文件输入的命令,从而实现用户与内核间的交互。
1-1  内核、shell以及用户界面
当用户登录成功,系统会启动一个交互式的shell来提示用户输入指令。用户键入命令后,shell开始执行任务:先解析命令行,再处理通配符、重定向、管道和作业控制,然后查命令,到后开始执行。UNIX/Linux初学者大都通过交互方式使用shell,即在命令提示符后逐条输入和执行命令。
如果总要键入一组大致相同的命令,自然会希望将这些工作自动化。把命令写到一个文件中,即脚本文件,然后执行这个文件就可以实现这一想法。shell脚本的作用跟批处理文件
的很相似,都是把一组UNIX/Linux命令输入文件,然后执行该文件。更复杂的脚本还包括用于实现判断、循环、文件测试等功能的程序结构。编写脚本不仅要掌握编程结构和编程技巧,还需要对UNIX/Linux工具集及其运行机理有较深的理解。有一些工具,如grepsedawk,在处理命令输出和文件时功能很强大。熟悉了这些工具和所用shell的程序结构后,就可以编写有用的脚本了。当用户从脚本中执行命令时,shell被视作一种编程语言。
1.2.1  UNIX shell
UNIX系统大都支持3种主流的shell,它们是Bourne shell(也称为AT&T shell)C shell(也称为Berkeley shell)Korn shell(Bourne shell的一个扩展集)。交互式运行时,这3shell非常相似,但作为脚本语言,它们在语法和效率上有一定的差别。
Bourne shell是标准的UNIX shell,用于系统管理。大部分系统管理脚本(rc startstop脚本、shutdown)都是Bourne shell脚本。管理员以root身份运行的通常是Bourne shellBourne shellAT&T开发的,以简练、紧凑和快速著称。默认的Bourne shell命令提示符是美元符号($)
C shell由美国加州大学Berkeley分校开发,增加了很多新的功能,比如命令行历史、别名、嵌入算术运算、文件名自动补全和作业控制。交互式用户喜欢C shell,但管理员们更喜欢用Bourne shell编写脚本。因为同样的脚本,用Bourne shell编写更简单,运行更快。默认的C shell命令提示符是百分号(%)
Korn shellAT&TDavid Korn开发的,它是Bourne shell的一个扩展集。在增强改进C shell的基础上,Korn shell添加了更多功能。Korn shell的功能特点包括:可编辑的命令历史、别名、函数、正则表达式通配符、嵌入算术运算、作业控制、协同处理以及特殊的调试功能。Korn shell几乎完全向上兼容Bourne shell,所以老的Bourne shell程序在Korn shell中运行良好。Novell公司开发了一个Korn shell的新版本(以前的版本为ksh93),支持在桌面上进行X Windows编程。dtksh.Dtksh是大多数UNIX系统硬件厂商所支持的通用桌面环境(Common Desktop EnvironmentCDE)的标准部件,Korn shell的公共域版本(/stable/shells/pdksh)称为pdksh,这种版本也在包括Linux在内的多种平台上可用。用于WindowsKorn shell可以在www.wipro/uwin上到。默认的Korn shell提示符是美元符号($)
1.2.2  Linuxshell
用户安装完Linux之后,就可以访问到GNUshell和工具(非标准UNIXshell和工具)Linux上默认的shellGNU bash(Bourne Again shell),这是一种增强的Bourne shell,其扩展的特性不仅表现在编程级别上,也表现在交互使用时,用户可以对自己的工作环境进行裁剪,建立快捷键以提高工作效率。bash是当前UNIXLinux用户使用得最为普遍的shell,可以通过/software/bash/bash.html下载。默认的Bash提示符为美元符号($)
Linux用户常用的另一个shellTC shellTC shellUNIX C shell的一个兼容分支,但是新增了许多附加功能,具体请访问/MostRecentRelease。默认的C shell提示符大于符号(>)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。