10.2.3 管道及命令组合
当一个命令行中有多条命令时,各命令之间应使用分隔符分隔。命令行中的命令分隔符除“;”外,还有管道操作符及后台执行符等,下面将介绍相关内容。
(1)管道
管道把一个命令的输出传递给另一个命令作为输入。管道操作符使用竖杠“|”表示。其语法格式为:
命令1 | 命令2
管道将命令1的输出作为命令2的输入,例如,为了查询系统中登录的用户数目,可以使用下述命令:
$who | wc –l
该命令行的功能等价于下述命令序列:
$who 〉 tempfile
$wc –l 〈tempfile
$rm tempfile
利用管道操作符将一系列命令连接起来就构成了管道线。管道线中的每条命令都作为一个单独的进程执行,每条命令的输出作为后一条命令的输入。
(2)命令执行次序
当多条命令出现在一个命令行中时,应使用分隔符来分隔各条命令。而命令的执行顺序也会随分隔符的不同而不同。可以使用的命令分隔符如表10-2所示。
表10-2 命令分隔符
上述命令分隔符具有不同的优先级,“;”、“|”和“&”具有相同的优先级,但它们的优先级低于“&&”和“||”,后两者优先级相同。当优先级相同时,按照从左到右的顺序执行命令。
例如,命令分隔符“;”放在一个命令行上的两个命令之间,对于下述命令行:
$date ; pwd
系统先执行命令date,然后执行命令pwd。
后台执行符“&”放在需要在后台执行的命令末尾,例如:
$cat temp 〉〉 file &
使用&&的一般形式为:命令1 && 命令2,例如,下述命令行如果成功地把文件f1拷贝到文件f2中,则把f1删除;否则不执行删除命令:
$cp f1 f2 && rm f1
使用||的一般形式为:命令1 || 命令2,例如,下述命令如果不能将文件abc的内容列出来,则显示当前工作目录的路径;否则不显示当前工作目录的路径:
$cat abc || pwd
(3)命令组合
在Shell中有两种方式可以将若干命令组合在一起,使其在逻辑上被视为一条命令。其实现方法是使用花括号{ }或者圆括号( )将一组命令括起来。这两种命令组合的执行过程相同,但是存在重要区别:使用花括号括起命令组时,命令组在本Shell内执行,不产生新的进程;而用圆括号括起命令组时,要建立新的子进程来执行命令组,因此在圆括号内的命令不会改变父Shell的变量值及工作目录等。
以花括号括起来的全部命令可视为语法上的一条命令,系统根据命令出现的先后次序执行这组命令,它的一般使用形式为:
{ 命令l;命令2;… }
使用花括号时在格式上应注意左括号后面应有一个空格;右括号之前应有一个分号,例如:
{ cd mydir ; ls ; }
该命令执行完后,shell的当前目录已改为mydir。
成组命令也可以用圆括号括起来。它的一般使用形式为:
(命令l;命令2;…)
例如,
( cd mydir ; ls ; )
该命令执行完后,其父shell的当前目录没有改变。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。