【问题标题】:The order in which pipeline components are executed in shell管道组件在shell中执行的顺序
【发布时间】:2016-02-01 10:07:00
【问题描述】:
ls | wc

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

【问题讨论】:

    标签: linux shell pipe


    【解决方案1】:

    不,不处理管道参数,这是由 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
    

    【讨论】:

      【解决方案2】:

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

      1. 启动两个子 shell A 和 B,A 的标准输出连接到 B 的标准输入。
      2. 在子shell A中,启动命令ls
      3. 在子shell B中,启动命令wc
      4. 等到所有子shell终止
      5. 设置$?为子shell B的退出状态(即wc的退出状态)

      bash 手册页有更多详细信息:

      管道

      管道是一个或多个命令的序列,由一个或多个命令分隔 控制操作员||&。管道的格式为:

      [time [-p]] [ ! ] command [ [|│|&] command2 ... ]
      

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

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

      如果time 保留字在管道之前,则经过的以及 报告执行所消耗的用户和系统时间 管道终止。 -p 选项将输出格式更改为 由 POSIX 指定。 TIMEFORMAT 变量可以设置为格式 指定应如何显示计时信息的字符串; 请参阅下面的 Shell 变量下TIMEFORMAT 的描述。

      管道中的每个命令都作为一个单独的进程执行(即,在 一个子shell)。

      【讨论】:

        猜你喜欢
        • 2021-06-05
        • 1970-01-01
        • 2011-12-11
        • 2016-04-21
        • 1970-01-01
        • 1970-01-01
        • 2016-06-03
        • 2017-05-05
        • 1970-01-01
        相关资源
        最近更新 更多