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

命令管道如何在*nix中工作?

  •  5
  • Srikanth  · 技术社区  · 16 年前

    当我这样做的时候:

    find . -name "pattern" | grep "another-pattern"
    

    是过程, find grep 一起产卵?我想是的。如果是这样,那么这是如何工作的?:

    yes | command_that_prompts_for_confirmations
    

    如果 yes 不断地将“y”发送到stdout和 command_that_prompts_for_confirmations 每当它读到它的stdin时,它怎么读? 知道何时终止?因为如果我跑步 单独一个没有管道输出到其他命令,它永远不会结束。

    但是如果管道命令不能同时生成所有进程,那么如何 知道要输出多少?这里是22号线。有人能给我解释一下这个管道是怎么工作的吗?

    4 回复  |  直到 16 年前
        1
  •  11
  •   Nick Fortescue    16 年前

    the wikipedia page : Yes命令本身输出“y”或指定为参数的任何内容,后跟一个换行符,直到用户停止或以其他方式终止为止;当通过管道输入命令时,它将继续运行,直到管道断开(即程序完成其执行)。

    yes 不知道何时终止。但是,在某个时刻,将“y”输出到stdout将导致错误,因为另一个进程已完成,这将导致管道断开,而yes将终止。

    顺序是:

    1. 其他程序终止
    2. 操作系统关闭管道
    3. 是尝试输出字符
    4. 发生错误(管道断裂)
    5. 是的,终止
        2
  •  5
  •   David Dean    16 年前

    是的,(一般来说)管道中的所有流程都是一起生成的。关于 yes 在类似的情况下,一个信号被传递回管道,以表明它不再接受输入。明确地: SIGPIPE 细节 here here . 更多有趣的信息,请访问*nix pipelining wikipedia .

    你可以看到 硅管 如果你中断了一个不需要的命令,当你得到一个 Broken Pipe 错误。不过,在我的Ubuntu设置中,我似乎找不到一个能在我头脑中完成这项任务的例子。

        3
  •  4
  •   Douglas Leeder    16 年前

    其他答案包括终止合同。另一个方面是Yes将只输出有限数量的y—管道中有一个缓冲区,一旦该缓冲区满了,Yes将阻塞其写入请求。因此,是不会消耗无限的CPU时间。

        4
  •  3
  •   Paul Tomblin    16 年前

    第一个进程的stdout连接到第二个进程的stdin,依此类推。”是”当第二个进程完成时退出,因为它不再具有要写入的stdout。