命令“ls | wc”

时间:2015-11-01 12:24:54

标签: linux shell pipe

在上面的shell脚本示例中,程序序列将如何执行。 ls会对待管道而wc是一个参数吗?或者哪一个会执行,它将采取什么样的论据?

2 个答案:

答案 0 :(得分:3)

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

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