【发布时间】:2016-02-01 10:07:00
【问题描述】:
ls | wc
ls 和 wc 在这里执行的顺序是什么?或者,| 和 wc 只是 ls 的参数吗?
【问题讨论】:
ls | wc
ls 和 wc 在这里执行的顺序是什么?或者,| 和 wc 只是 ls 的参数吗?
【问题讨论】:
不,不处理管道参数,这是由 shell 完成的。
ls命令的stdout的内容,作为wc从stdin的输入。
ls [stdout]|* [stdin]* wc -l
命令 wc 将获取该标准输出内容作为输入。
这两个命令都由 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
【讨论】:
在表达式ls | wc 中,您的shell 将大致执行以下操作:
ls
wc
$?为子shell B的退出状态(即wc的退出状态)bash 手册页有更多详细信息:
管道
管道是一个或多个命令的序列,由一个或多个命令分隔 控制操作员
|或|&。管道的格式为:[time [-p]] [ ! ] command [ [|│|&] command2 ... ]command 的标准输出通过管道连接到command2 的标准输入。此连接在任何重定向之前执行 由命令指定(参见下面的
REDIRECTION)。如果使用|&,则 命令的标准错误连接到 command2 的标准输入 通过管道;它是2>&1 |的简写。这种隐含的 在任何重定向之后执行标准错误的重定向 由命令指定。一个管道的返回状态是最后一个的退出状态 命令,除非启用了
pipefail选项。如果pipefail是 启用,管道的返回状态是最后的值 (最右边)命令以非零状态退出,如果全部退出则为零 命令成功退出。如果保留字!位于 管道,该管道的退出状态是逻辑否定 如上所述的退出状态。 shell 等待所有命令 在返回值之前在管道中终止。如果
time保留字在管道之前,则经过的以及 报告执行所消耗的用户和系统时间 管道终止。-p选项将输出格式更改为 由 POSIX 指定。TIMEFORMAT变量可以设置为格式 指定应如何显示计时信息的字符串; 请参阅下面的 Shell 变量下TIMEFORMAT的描述。管道中的每个命令都作为一个单独的进程执行(即,在 一个子shell)。
【讨论】: