Linux 在shell中执行管道组件的顺序

Linux 在shell中执行管道组件的顺序,linux,shell,pipe,Linux,Shell,Pipe,在这里执行的顺序是什么?或者,如果|和wc只是ls的参数?在表达式ls | wc中,shell将大致执行以下操作: 启动两个子外壳A和B,A的标准输出连接到B的标准输入 在子shell A中,启动命令ls 在subshell B中,启动命令wc 等待所有子shell终止 将$?设置为子shell B的退出状态(即wc的退出状态) bash主页包含更多详细信息: 管道 管道是一个由一个或多个命令组成的序列,由以下命令之一分隔: 控制运算符|或|&。管道的格式为: ls | wc 命令的标准输出通

在这里执行的顺序是什么?或者,如果
|
wc
只是
ls
的参数?

在表达式
ls | wc
中,shell将大致执行以下操作:

  • 启动两个子外壳A和B,A的标准输出连接到B的标准输入
  • 在子shell A中,启动命令
    ls
  • 在subshell B中,启动命令
    wc
  • 等待所有子shell终止
  • $?
    设置为子shell B的退出状态(即
    wc
    的退出状态)
  • bash
    主页包含更多详细信息:

    管道 管道是一个由一个或多个命令组成的序列,由以下命令之一分隔: 控制运算符
    |
    |&
    。管道的格式为:

    ls | wc
    
    命令的标准输出通过管道连接到command2的标准输入。此连接在任何重定向之前执行 由命令指定(请参见下面的重定向)。如果使用了
    |&
    ,则 命令的标准错误连接到command2的标准输入 通过管道;它是
    2>和
    的简写形式。这含蓄
    标准错误的重定向在任何重定向之后执行
    由命令指定

    管道的返回状态是最后一个管道的退出状态 命令,除非启用了
    pipefail
    选项。如果
    pipefail
    为 启用时,管道的返回状态为最后一个 (最右边)以非零状态退出的命令,如果全部为零,则为零 命令成功退出。如果保留字
    位于
    管道,该管道的出口状态为
    退出状态如上所述。shell等待所有命令
    在管道中,在返回值之前终止

    如果
    时间
    保留字位于管道之前,则经过的时间以及 当 管道终止。
    -p
    选项将输出格式更改为 由POSIX指定。
    TIMEFORMAT
    变量可以设置为 指定如何显示定时信息的字符串; 请参阅下面Shell变量下的
    TIMEFORMAT
    说明

    管道中的每个命令都作为单独的进程执行(即 子壳)


    不,ls不处理管道参数,这是由shell完成的

    ls命令的stdout的内容作为来自stdin的wc的输入

    ls[stdout]|*[stdin]*wc-l

    wc命令将获取该标准输出内容作为输入

    在这里,这两个命令由shell作为不同的进程执行。 这意味着两者都有不同的PID

    要验证您自己的答案,请使用ps | cat。您可以看到不同的过程cat和ps

    [time [-p]] [ ! ] command [ [|│|&] command2 ... ]
    
      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