在上面的shell脚本示例中,程序序列将如何执行。 ls会对待管道而wc是一个参数吗?或者哪一个会执行,它将采取什么样的论据?
答案 0 :(得分:3)
在表达式ls | wc
中,shell将执行大致以下操作:
ls
wc
$?
设置为子shell B的退出状态(即wc
的退出状态) bash
联机帮助页有更多详细信息:
管道
管道是由一个或多个命令分隔的一个或多个命令的序列 控制运算符
|
或|&
。管道的格式是:[time [-p]] [ ! ] command [ [|│|&] command2 ... ]
命令的标准输出通过管道连接到 command2 的标准输入。此连接在任何重定向之前执行 由命令指定(参见下面的
REDIRECTION
)。如果使用|&
,则为 命令的标准错误连接到 command2 的标准输入 通过管道;它是2>&1 |
的简写。这含蓄 在重定向之后执行标准错误的重定向 由命令指定。管道的返回状态是最后一个的退出状态 命令,除非启用
pipefail
选项。如果是pipefail
启用后,管道的返回状态是最后一个的值 (最右边)命令以非零状态退出,如果全部退出则为零 命令退出成功。如果保留字!
在a之前 管道,该管道的退出状态是逻辑否定 退出状态如上所述。 shell等待所有命令 在管道中在返回值之前终止。如果
time
保留字在管道之前,则已经过去了 当执行时,会报告其执行所消耗的用户和系统时间 管道终止。-p
选项将输出格式更改为该格式 由POSIX指定。TIMEFORMAT
变量可以设置为格式 string,指定如何显示定时信息; 请参阅下面的Shell变量下的TIMEFORMAT
说明。管道中的每个命令都作为一个单独的进程执行(即,在 一个子壳)。
答案 1 :(得分:0)
不,我没有处理管道参数,这是由shell完成的。
ls命令的stdout内容被作为来自stdin的wc的输入。
ls [stdout] | * [stdin] * wc -l </ strong>
命令wc将该stdout内容作为输入。
这里两个命令都是由shell执行的不同进程。 这意味着两者都有不同的PID。
为了验证你自己这个答案,使用 ps | cat。你可以看到不同的进程cat和ps。
PID TTY TIME CMD
11695 pts/1 00:00:00 bash
12207 pts/1 00:00:00 ps
12208 pts/1 00:00:00 cat