`
xitong
  • 浏览: 6193440 次
文章分类
社区版块
存档分类
最新评论

bash参考手册之三(基本的Shell特性)续一

 
阅读更多

3.2.2 管道

管道是由控制操作符'|'或'|&'分隔开的一组简单命令的序列。
管道的格式
[time [-p]] [!] command1 [ [| or |&] command2 …]
在管道中的每个命令的输出是通过管道连接到下一个命令的输入。也就是说,每个命令读取前一个命令的输出。此连接在该命令指定的重定向之前执行。
如果使用'|&',则command1的标准错误通过管道连接到command2的标准输入。它是 2>&1 |的简写。这个隐含的标准错误重定向在其他重定向之后执行。
保留字time,会在管道完成后,打印时间统计数据。目前的统计数据包括整个管道的执行时间,以及命令执行消耗的用户时间和系统时间。 -p选项指定了POSIX输出格式。当shell在POSIX模式(参见bash POSIX模式),如果下一个标记以一个“ - ”开始时,它不识别time为保留字。 TIMEFORMAT变量可以设置为一个字符串,以设置显示时间的格式。可用的格式的说明(见 Bash变量)。time保留字允许记录shell的内建命令,shell函数和管道的计时。外部命令time不能容易地达到这些计时的目的。
当shell在POSIX模式(参见bash POSIX模式),time后面可能会跟着一个换行符。在这种情况下,shell显示由shell和它的子进程消耗的总的用户和系统时间。变量TIMEFORMAT被用来指定时间信息的格式。
如果管道不是异步执行的(见列表),shell会等待管道中的所有命令完成。
在管道中的每个命令在其自己的子shell中执行(见命令执行环境)。管道的退出状态是在管道中的最后一个命令的退出状态,除非pipefail选项被启用(参见内建命令set)。如果启用了pipefail,管道的返回值是最后一个(最右边)的命令的退出状态,可能是一个非零的值,或者,如果所有命令成功完成,则是零值。如果保留字'!'位于管道之前,则退出状态是上述的退出状态的逻辑否。 shell等待管道中的所有命令终止后才返回一个值。


3.2.3 命令列表

命令列表是由一个或多个管道组成的序列,它们被这些分隔符号“;“,”&“,”&&“,”| |“分隔,并且由一个';','&',或换行符终止。
在这些操作符中,“&&”和“| |”具有相同的优先级,然后';'和'&',具有相同的优先级。
可能会出现一个或多个换行符来分隔命令列表,它们相当于分号。
如果命令终止于控制操作符'&',shell将在子shell中异步执行这个命令。这被称为在后台执行命令。 shell不会等待命令完成,返回值是0(真)。当作业控制没有被激活时(见作业控制),异步命令的标准输入,在没有指定明确的重定向时,将被重定向到/dev/null。
“;”分隔开的命令将按顺序执行,shell会等待每个命令都终止。返回状态是最后执行的命令的退出状态。
AND和OR命令列表,是使用控制操作符“&&”和“| |”分隔的一个或多个管道组成的序列。 AND和OR命令列表按左结合执行。
AND命令列表的形式

command1 && command2

command2,当且仅当,command1返回的退出状态是零的情况下才执行。

OR命令列表的形式

command1 || command2

command2,当且仅当,command1返回的退出状态非零的情况下才执行。

AND和OR命令列表的返回状态,是命令列表中的最后一个执行的命令的退出状态。




原文链接:http://www.gnu.org/software/bash/manual/bash.html#Pipelines

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics