当我这样做时:
find . -name "pattern" | grep "another-pattern"
流程find
和grep
是否一起催生了?我的猜测是肯定的。如果是这样,那么这是如何工作的?:
yes | command_that_prompts_for_confirmations
如果yes
持续向stdout发送'y'并且command_that_prompts_for_confirmations
在读取其stdin时读取'y',yes
如何知道何时终止?因为如果我单独运行yes
而没有将其输出传递给其他命令,它就永远不会结束。
但是如果管道命令不能同时产生所有进程,那么yes
如何知道要输出多少个?这对我来说是22。有人能解释一下这个管道在* NIX中是如何工作的吗?
答案 0 :(得分:11)
从the wikipedia page:“本身,yes命令输出'y'或任何指定为参数的内容,后跟换行符,直到被用户停止或以其他方式终止;当用管道输入时命令,它将一直持续到管道中断(即程序完成执行)。“
yes
不知道何时终止。但是,在某些时候输出“y”到stdout将导致错误,因为另一个进程已经完成,这将导致管道损坏,并且是将终止。
序列是:
答案 1 :(得分:5)
是的,(一般来说)管道中的所有流程都是一起产生的。关于yes
和类似的情况,信号被传递回管道以指示它不再接受输入。具体来说:SIGPIPE
,详情here和here。有关* nix流水线的更多有趣信息可在wikipedia上找到。
如果您中断了一个不期望它的命令,您可以看到SIGPIPE
正在运行,因为您收到Broken Pipe
错误。我似乎无法找到一个在我的Ubuntu设置上做到这一点的例子。
答案 2 :(得分:4)
其他答案已涵盖终止。另一个方面是yes只会输出有限数量的y - 管道中有一个缓冲区,一旦填满,yes将阻止其写入请求。因此,yes不会消耗无限的CPU时间。
答案 3 :(得分:3)
第一个进程的stdout连接到第二个进程的stdin,依此类推。当第二个进程完成时,“yes”退出,因为它不再有要写入的标准输出。