管道(Pipelines)
管道是由一个控制操作符|或|&分隔的一个或多个命令的序列。管道的格式是:
命令 command1 的标准输出通过管道“连接”到 command2 的标准输入。此“连接”在命令指定的任何重定向之前执行(请参阅下面的 REDIRECTION 部分)。如果使用|&,则除了标准输出外,命令的标准错误还通过管道连接到 command2 的标准输入;它是2>&1 |的简写。标准错误到标准输出的隐式重定向是在 command1 指定的任何重定向之后执行的。
除非启用了 pipefail 选项,否则管道的返回状态是最后一个命令的退出状态。如果启用了 pipefail,则管道的返回状态是“以非零状态退出的最后一个(最右边)命令”的值,如果所有命令都成功退出,则返回零。如果保留字!在管道之前,该管道的退出状态是如上所述的退出状态的逻辑否定。Shell 在返回值之前等待管道中的所有命令终止。
如果 time 保留字在管道之前,则在管道终止时报告其执行所消耗的经过时间以及用户和系统时间。选项-p 将输出格式更改为 POSIX 指定的格式。当 Shell 处于 posix 模式时,如果下一个标记以“-”开头,则它不会将 time 识别为保留字。变量 TIMEFORMAT 可以设置为格式字符串,指定如何显示定时信息;请参阅下面的 Shell 变量下的 TIMEFORMAT 说明。
当 shell 处于 posix 模式时,time 可以跟在换行符之后。在这种情况下,shell 显示 shell 及其子级占用的总用户和系统时间。TIMEFORMAT 变量可用于指定时间信息的格式。
管道中的每个命令作为单独的过程(即,在子 Shell 中执行)。