Chinaunix首页 | 论坛 | 博客
  • 博客访问: 723766
  • 博文数量: 823
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5165
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-21 15:52
文章分类

全部博文(823)

文章存档

2011年(1)

2008年(822)

我的朋友

分类: LINUX

2008-08-21 17:37:53


什么是Shell?

Shell是一种具备特殊功能的程序,它是介于使用者和UNIX/Linux操作系统之核心程序(kernel)间的一个接口。为什么我们说shell是一种介于系统核心程序与使用者间的中介者呢?读过操作系统概论的读者们都知道操作系统是一个系统资源的管理者与分配者,当您有需求时,您得向系统提出;从操作系统的角度来看,它也必须防止使用者因为错误的操作而造成系统的伤害?众所周知,对计算机下命令得透过命令(command)或是程序(program);程序有编译器(compiler)将程序转为二进制代码,可是命令呢?其实shell也是一支程序,它由输入设备读取命令,再将其转为计算机可以了解的机械码,然后执行它。
各种操作系统都有它自己的shell,以DOS为例,它的shell就是command.com檔。如同DOS下有NDOS,4DOS,DRDOS等不同的命令解译程序可以取代标准的command.com,UNIX下除了Bourneshell(/bin/sh)外还有Cshell(/bin/csh)、Kornshell(/bin/ksh)、Bourneagainshell(/bin/bash)、TenexCshell(tcsh)…等其它的shell。UNIX/Linux将shell独立于核心程序之外,使得它就如同一般的应用程序,可以在不影响操作系统本身的情况下进行修改、更新版本或是添加新的功能。

Shell的激活

在系统起动的时候,核心程序会被加载内存,负责管理系统的工作,直到系统关闭为止。它建立并控制着处理程序,管理内存、档案系统、通讯等等。而其它的程序,包括shell程序,都存放在磁盘中。核心程序将它们加载内存,执行它们,并且在它们中止后清理系统。Shell是一个公用程序,它在您签入时起动。藉由解译使用者输入的命令(由命令列或命令档),Shell提供使用者和核心程序产生交谈的功能。
当您签入(login)时,一个交谈式的shell会跟着起动,并提示您输入命令。在您键入一个命令后,接着就是shell的工作了,它会进行:
1.语法分析命令列
2.处理万用字符(wildcards)、转向(redirection)、管线(pipes)与工作控制(jobcontrol)
3.搜寻并执行命令
当您刚开始学UNIX/Linux系统时,您大部份的时间会花在于提示符号(prompt)下执行命令。
如果您经常会输入一组相同形式的命令,您可能会想要自动执行那些工作。如此,您可以将一些命令放入一个档案(称为命令档,script),然后执行该档。一个shell命令档很像是DOS下的批次檔(如Autoexec.bat):它把一连串的UNIX命令存入一个档案,然后执行该档。较成熟的命令档还支持若干现代程序语言的控制结构,譬如说能做条件判断、循环、档案测试、传送参数等。要写着写命令档,不仅要学习程序设计的结构和技巧,而且对UNIX/Linux公用程序及如何运作需有深入的了解。有些公用程序的功能非常强大(例如grep、sed和awk),它们常被用于命令档来操控命令输出和档案。在您对那些工具和程序设计结构变得熟悉之后,您就可以开始写命令档。当由命令档执行命令时,此刻,您就已经把shell当做程序语言使用了。
细说Shell的生平

第一个有重要意义的,标准的UNIXshell是V7(AT&T的第七版)UNIX,在1979年底被提出,且以它的创造者StephenBourne来命名。Bourneshell是以Algol这种语言为基础来设计,主要被用来做自动化系统管理工作。虽然Bourneshell以简单和速度而受欢迎,但它缺少许多交谈性使用的特色,例如历程、别名和工作控制。
Cshell是在加州大学柏克来分校于70年代末期发展而成,而以2BSDUNIX的部分发行。这个shell主要是由BillJoy写成,提供了一些在标准Bourneshell所看不到的额外特色。Cshell是以C程序语言作为基础,且它被用来当程序语言时,能共享类似的语法。它也提供在交谈式运用上的改进,例如命令列历程、别名和工作控制。因为Cshell是在大型机器上设计出来,且增加了一些额外功能,所以Cshell有在小型机器上跑得较慢,即使在大型机器上跟Bourneshell比起来也显得缓慢。
有了Bourneshell和Cshell之后,UNIX使用者就有了选择,且争论那一个shell较好。AT&T的DavidKorn在80年代中期发明了Kornshell,在1986年发行且在1988年成为正式的部分SVR4UNIX。Kornshell实际上是Bourneshell的超集,且不只可在UNIX系统上执行,同时也可在OS/2、VMS、和DOS上执行。它提供了和Bourneshell向上兼容的能力,且增加了许多在Cshell上受欢迎的特色,更增加了速度和效率。Kornshell已历经许多修正版,要找寻您使用的是那一个版本可在ksh提示符号下按Ctrl-v键。

三种主要的Shell与其分支

在大部份的UNIX系统,三种著名且广被支持的shell是Bourneshell(AT&Tshell,在Linux下是BASH)、Cshell(Berkeleyshell,在Linux下是TCSH)和Kornshell(Bourneshell的超集)。这三种shell在交谈(interactive)模式下的表现相当类似,但作为命令文件语言时,在语法和执行效率上就有些不同了。
Bourneshell是标准的UNIXshell,以前常被用来做为管理系统之用。大部份的系统管理命令文件,例如rcstart、stop与shutdown都是Bourneshell的命令档,且在单一使用者模式(singleusermode)下以root签入时它常被系统管理者使用。Bourneshell是由AT&T发展的,以简洁、快速著名。Bourneshell提示符号的默认值是$。
Cshell是柏克莱大学(Berkeley)所开发的,且加入了一些新特性,如命令列历程(history)、别名(alias)、内建算术、档名完成(2005510144912.htmcompletion)、和工作控制(jobcontrol)。对于常在交谈模式下执行shell的使用者而言,他们较喜爱使用Cshell;但对于系统管理者而言,则较偏好以Bourneshell来做命令档,因为Bourneshell命令檔比Cshell命令档来的简单及快速。Cshell提示符号的默认值是%。
Kornshell是Bourneshell的超集(superset),由AT&T的DavidKorn所开发。它增加了一些特色,比Cshell更为先进。Kornshell的特色包括了可编辑的历程、别名、函式、正规表达式万用字符(regularexpressionwildcard)、内建算术、工作控制(jobcontrol)、共作处理(coprocessing)、和特殊的除错功能。Bourneshell几乎和Kornshell完全向上兼容(upwardcompatible),所以在Bourneshell下开发的程序仍能在Kornshell上执行。Kornshell提示符号的默认值也是$。在Linux系统使用的Kornshell叫做pdksh,它是指PublicDomainKornShell。
除了执行效率稍差外,Kornshell在许多方面都比Bourneshell为佳;但是,若将Kornshell与Cshell相比就很困难,因为二者在许多方面都各有所长,就效率和容易使用上看,Kornshell是优于Cshell,相信许多使用者对于CShell的执行效率都有负面的印象。
在shell的语法方面,Kornshell是比较接近一般程序语言,而且它具有子程序的功能及提供较多的资料型态。至于Bourneshell,它所拥有的资料型态是三种shell中最少的,仅提供字符串变量和布尔型态。在整体考量下Kornshell是三者中表现最佳者,其次为Cshell,最后才是Bourneshell,但是在实际使用中仍有其它应列入考虑的因素,如速度是最重要的选择时,很可能应该采用Bourneshell,因它是最基本的shell,执行的速度最快。
tcsh是近几年崛起的一个免费软件(Linux下的Cshell其实就是使用tcsh)执行,它虽然不是UNIX的标准配备,但是从许多地方您都可以下载到它。如果您是Cshell的拥护者,笔者建议不妨试试tcsh,因为您至少可以将它当作是Cshell来使用。如果您愿意花点时间学习,您还可以享受许多它新增的优越功能,例如:
1.tcsh提供了一个命令列(commandline)编辑程序。
2.提供了命令列补全功能。
3.提供了拼字更正功能。它能够自动检测并且更正在命令列拼错的命令或是单字。
4.危险命令侦测并提醒的功能,避免您一个不小心执行了rm*这种杀伤力极大的命令。
5.提供常用命令的快捷方式(shortcut)。

bash对Bourneshell是向下兼容(backwardcompatible),并融入许多Cshell与Kornshell的功能。这些功能其实Cshell(当然也包括了tcsh)都有,只是过去Bourneshell都未支持。以下笔者将介绍bash六点重要的改进(详细的使用说明笔者会在以后的章节介绍):
1.工作控制(jobcontorl)。bash支持了关于工作的讯号与指令,本章稍后会提及。
2.别名功能(aliases)。alias命令是用来为一个命令建立另一个名称,它的运作就像一个宏,展开成为它所代表的命令。别名并不会替代掉命令的名称,它只是赋予那个命令另一个名字。
3.命令历程(commandhistory)。BASHshell加入了Cshell所提供的命令历程功能,它以history工具程序记录了最近您执行过的命令。命令是由1开始编号,默认值为500。history工具程序是一种短期记忆,记录您最近所执行的命令。要看看这些命令,您可以在命令列键入history,如此将会显示最近执行过之命令的清单,并在前方加上编号。
这些命令在技术上每个都称为一个事件。事件描述的是一个已经采取的行动(已经被执行的命令)。事件是依照执行的顺序而编号,越近的事件其编号码越大,这些事件都是以它的编号或命令的开头字符来辨认的。history工具程序让您参照一个先前发生过的事件,将它放在命令列上并允许您执行它。最简单的方法是用上下键一次放一个历程事件在您的命令列上;您并不需要先用history显示清单。按一次向上键会将最后一个历程事件放在您的命令列上,再按一次会放入下一个历程事件。按向下键则会将前一个事件放在命令列上。
4.命令列编辑程序。BASHshell命令列编辑能力是内建的,让您轻松地在执行之前修改您输入的命令。若是您在输入命令时拼错了字,您不需重新输入整个命令,只需在执行命令之前使用编辑功能纠正错误即可。这尤其适合于使用冗长的路径名称当作参数的命令时。命令列编辑作业是Emacs编辑命令的一部份。您可以用Ctrl-F或向右键往前移一个字符,Ctrl-b或向左键往回移一个字符。Ctrl-d或DEL键会删除光标目前所在处的字符。要增加文字的话,您只需要将光标移到您要插入文字的地方并键入新字符即可。无论何时,您都可以按ENTER键执行命令。
5.允许使用者自订按键。
6.提供更丰富的变量型态、命令与控制结构至shell中。
 
bash与tcsh一样可以从许多网站上免费下载,它们的性质也十分类似,都是整合其前一代的产品然后增添新的功能,这些新增的功能主要都着重在强化shell的程序设计能力以及让使用者能够自行定义自己偏好的作业环境。除了上述的五种shell之外,zsh也是一个广为UNIX程序设计人员与进阶使用者所采用的shell,zsh基本上也是Bourneshell功能的扩充。
Shell的使用
不论是哪一种Shell,它最主要的功用都是解译使用者在命令列提示符号下输入的指令。Shell语法分析命令列,把它分解成以空白区分开的符号(token),在此空白包括了跳位键(tab)、空白和换行(NewLine)。如果这些字包含了metacharacter,shell将会评估(evaluate)它们的正确用法。另外,shell还管理档案输入输出及幕后处理(backgroundprocessing)。在处理命令列之后,shell会寻找命令并开始执行它们。
Shell的另一个重要功用是提供个人化的使用者环境,这通常在shell的初始化档案中完成(.profile、.login、.cshrc、.tcshrc等等)。这些档案包括了设定终端机键盘和定义窗口的特征;设定变量,定义搜寻路径、权限限、提示符号和终端机类形;以及设定特殊应用程序所需要的变量,例如窗口、文字处理程序、及程序语言的链接库。Kornshell和Cshell加强了个别化的能力:增加历程、别名、和内建变量集以避免使用者误杀档案、不慎签出、并在当工作完成时通知使用者。
Shell也能当解译性的程序语言(interpretedprograminglanguage)。Shell程序,通常叫做命令文件,它由列在档案内的命令所构成。此程序在编辑器中编辑(虽然也可以直接在命令列下写作程序,onlinescripting),由UNIX命令和基本的程序结构,例如变量的指定、测试条件、和循环所构成。您不需要编译shell命令檔。Shell本身会解译命令档中的每一行,就如同由键盘输入一样。shell负责解译命令,而使用者则必须了解这些命令能做什么。这本书的索引列出了一些有用的命令和它们的使用方法。

Shell的功用

为了确保任何提示符号下输入的命令都能够适当地执行。shell担任的工作包括有:
1.读取输入和语法分析命令列
2.对特殊字符求值
3.设立管线、转向、和幕后处理
4.处理讯号
5.设立程序来执行

下载本文示例代码
阅读(171) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~