代码之家  ›  专栏  ›  技术社区  ›  Bob

bash管道——如果第一个可执行文件退出,所有下游可执行文件都会退出吗?

  •  1
  • Bob  · 技术社区  · 5 年前

    如果我有任意数量的管道源和汇

    exec1 | exec2 | exec3 | ...

    问题

    1. 那么如果 execN 出口,好吗 execM 下游(M>N)也退出?
    2. 上游(M<N)会发生什么?
    1 回复  |  直到 5 年前
        1
  •  6
  •   chepner    5 年前

    下游流程不一定会退出。什么时候 execN 退出时,它关闭管道的写入端,从而关闭管道的读取端 execN+1 的标准输入。但直到 执行官+1 试图 阅读 从标准输入中,它不会注意到,即使这样,它也会简单地检测到它已经到达了文件的末尾;它可以继续做其他事情,也可以根据自己的决定退出。

    上游 execN-1 我不会注意到的 执行官 已退出并关闭管道的读取端,直到 execN-1 尝试写入其管道末端,此时它将接收到SIGPPIPE信号。该信号的默认处理程序是退出,但是 execN-1 可以安装自己的处理程序来决定何时以及是否发生这种情况。