8.2.5 命令分隔和命令分组
当用户交互地向shell输入命令时,或者在编写shell脚本时,必须分隔不同的命令。本节将首先回顾第5章所讲的命令分隔方法,还介绍了几个新的方法。本节适用于Bourne Again和TC Shell。
1. 使用;和换行符分隔命令
换行符是一个独特的命令分隔符,因为它将启动该字符前面的命令执行。在阅读本书过程中,每次在命令行末尾输入RETURN键的时候,都会遇到这种情形。
分号;也是一种命令分隔符,但是它并不立即启动命令执行,也不改变命令的任何功能。用户可以在单独一个命令行中连续地输入一串命令,并用分号;彼此分开。通过输入RETURN键启动这串命令:
$ x ; y ; z |
对于命令x、y和z,这个命令行产生的结果与下面示例的中3个命令产生的结果相同。不同之处在于,下面的示例中,每个命令(x、y和z)执行完毕之后,shell均发出一个提示符,而前面的示例中shell仅仅在z执行完毕之后才发出提示符。
$ x \ |
空格符 尽管前面的示例中,分号;左右都有空格符使得命令行更加便于阅读,但是这些空格符并不是必需的。任何命令分隔符左右均不需要空格或者制表符。
2. \继续命令
当输入一个比较长的命令行时,光标已经到达屏幕右端,这时候可以使用反斜杠字符\在下一行继续这条命令。反斜杠引用了换行符(也就是将其转义),这样shell就不会将这个换行符作为一个命令终结符对待。用单引号将反斜杠字符括起来,就可以关闭反斜杠字符转义特殊字符(如换行符)的功能。而用双引号括起来不会影响反斜杠字符的这个功能。
尽管可以在一个字(记号)中间进行换行,但是一般情况下,在空格符前或后换行更便于阅读。
选读 |
3. |和&分隔命令及其他功能
管道符号|和后台任务符号&也是命令分隔符。它们并不开始执行命令而是在某些方面改变命令的功能。管道符号改变标准输入的源或者是标准输出的目的地。而后台任务符号使shell在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作。
下面每个命令行都启动了一个由3个任务组成的作业:
S x | y | z |
在第1个作业中,shell将任务x的标准输出重定向到任务y的标准输入,同时还将y的标准输出重定向到z的标准输入。
因为整个作业均在前台执行,所以在任务z运行完毕之前shell不会显示提示符:在任务y结束之前z不会结束,而在x结束之前y不会结束。在第2个作业中,任务x是ls -l命令,任务y是grep tmp,任务z是分页实用程序less。shell显示当前工作目录下面包含字符串tmp的文件列表,通过管道传给less。
下一个命令行在后台执行任务d和e,而在前台执行任务f:
$ d & e & f |
shell将作业数目显示在方括号[ ]中,同时还显示了在后台运行的每个进程的PID(process identification,进程标识)编号。在f结束后就会立即得到一个shell提示符,此时d或者e还可能尚未执行完毕。
在显示提示符以接受新的命令之前,shell检查后台运行的作业是否完成。每完成一个作业,shell均显示其作业编号、字Done以及调用该作业的命令行,然后shell才会给出一个提示符。在列出作业编号时,最后一个开始的作业的编号后面将跟着一个字符+,而前一个作业的编号后面会跟着一个字符-。任何其他作业列出时有一个空格符。在运行最后一条命令后,shell在给出提示符之前将显示下面的内容:
[1]- Done d |
下面的命令行将在后台执行所有3个作业。这时用户将立即得到一个提示符:
$ d & e & f & |
可用管道将一个任务的输出发送给下一个任务,并用&将整个作业作为一个后台任务运行。这时提示符也会立即出现。shell会将通过管道连接的多个命令当作一个单独的作业。也就是说,它将管道视为单独的任务,而不管管道符号|连接的任务数量或者这些任务有多么复杂。Bourne Again Shell显示了仅有一个进程在后台执行的情形:
$ d | e | f & |
TC Shell显示了3个进程(均属于作业1)在后台执行的情形:
tcsh $ d | e | f & |
选读
4. ( )命令分组
可以使用圆括号进行命令分组。shell为每个命令组创建一个自身的副本,称为子shell。它将每组命令作为一个作业,并为每个命令创建一个新的进程来执行(查阅本章第8.4.1节以获取创建子shell的更多信息)。每个子shell(作业)有各自的运行环境,这就意味着它们各自都有自己的一组与其他子shell不同值的变量。
下面的命令行在后台先后执行命令a和b,与此同时还在后台执行c。shell立即给出提示符。
$ (a ; b) & c & |
前面的示例与更早的那个示例d & e & f &不同,因为任务a和b是相继启动的,而不是同时启动。
类似地,下面的命令行在后台相继执行a和b,同时,在后台相继执行c和d。运行a和b的子shell和运行c和d的子shell同时运行。shell立即显示提示符。
$ (a ; b) & (c ; d) & |
下一个脚本将复制一个目录到另一个目录中。第2对圆括号将创建一个子shell来运行管道后面的命令。因为这些圆括号,第1个tar命令的输出可用于第2个tar命令,而不管中间的cd命令。如果没有圆括号,第1个tar命令的输出将会发送给cd,然后被丢弃,这是因为cd并不处理来自标准输入的输入数据。shell变量$1和$2分别代表命令行的第1个参数和第2个参数。第1对圆括号创建一个子shell来运行前面两个命令,这样用户就可以使用相对路径名来调用cpdir。如果没有这对圆括号,第1个cd命令将改变该脚本的工作目录(同时还会导致第2个cd命令的工作目录改变)。
$ cat cpdir |
cpdir命令行将目录/home/alex/sources下面的所有文件和目录复制到名为/home/alex/ memo/biblio的目录中。这个shell脚本的功能基本上与带-r选项的cp实用程序一样。查阅本书第Ⅴ部分以获取cp和tar的详细信息。
| 回书目 上一节 下一节 |
|
· 2008年5月24日软考试题.. · 软件设计师专家临考模.. · 上周网络管理员专家自.. · 网络工程师自测获奖名.. · 08年4月各大网上书店及.. · 系统分析师自测获奖名.. |
· Linux结课考试自测获奖.. · 上周Linux系统命令的使.. · 上周真题冲刺测试获奖.. · 全国计算机等考四级模.. · 08年3月各大网上书店及.. · 网络工程师模拟测试获.. |
|
||||
| · 勇闯IT培训黑色围城 · IPv6协议--拓展网络无.. · 了解统一威胁管理(UTM).. · 调查:十大发现 解秘技.. · 技术人求职简历完备手册 · Vista SP1对决XP SP3 · 运营商封堵ADSL共享 中.. · LAMP技术精解 |
· PHP开发应用手册 · 解析35岁技术人的价值.. · 汶川大地震 IT技术人在.. · SOA 面向服务架构 · 龙芯要做中国的“奔腾” · 微软出价446亿美元收购.. · 网管员如何踏上高薪之路 · 主流品牌防火墙配置 |
|||
|
||||
| · SQL Server 2008/2005.. · SOA 面向服务架构 · SQL Server 2008/2005.. · iSCSI应用与发展 · RAID——磁盘阵列基础 · Apache技术专题 · 三层交换技术专题 · SQL Server入门到精通 |
· Apache技术专题 · 国际文档格式标准开战 · 路由器设置与口令恢复 · 打造安全服务器 · PHP开发应用手册 · SOA 面向服务架构 · 企业数据恢复指南 · ADSL应用面面俱到 |
|||
|
||||
| · iSCSI应用与发展 · SQL Server入门到精通 · SQL Server 2008/2005.. · SOA 面向服务架构 · Apache技术专题 · iSCSI应用与发展 · 三层交换技术专题 · Apache技术专题 |
· RAID——磁盘阵列基础 · 企业数据恢复指南 · 路由器设置与口令恢复 · SOA 面向服务架构 · 了解统一威胁管理(UTM).. · ADSL应用面面俱到 · ADSL应用面面俱到 · 反垃圾邮件技术应用 |
|||