Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104667608
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-18 23:29:09

作者:Vs  出处:Unix爱好者家园unix-cd.com  
  
三种主要的 Shell 与其分支

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


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

Shell 的功用

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

上一篇:awk用法小结

下一篇:简单的ping IP的脚本

给主人留下些什么吧!~~