我对Bash管道的理解是执行a-process | another-process
会同时运行a-process
和another-process
,而不是在开始后者之前等待前者完成。 (否则yes | interactive-script
没有意义)。但是如果交互式脚本需要很长时间才能运行,那么yes
似乎会打印这么多,而interactive-script
可能只需要其中的一些。这种情况让我对一大堆问题感到好奇:
yes
将一直写入管道,直到脚本终止?yes | long-interactive-script
运行时做了一些其他的工作。 yes
会对我的其他工作产生不可忽视的影响吗?(for i in $(seq 12); do echo 'yes'; done) | long-interactive-script
,还是会有更优雅的解决方案来完成这项任务?interactive-script
的要求回答是。是否有一般方法可以确定interactive-script
是否在输入阅读时被阻止,并且仅在这种情况下提供是?答案 0 :(得分:3)
您缺少的是管道只能容纳有限数量的数据。一旦yes
进程填满(这将很快发生 - 毫秒或更短),它将被阻止并且不会再使用CPU时间,直到第二个进程读取一些数据。
在Linux上,您可以使用cat /proc/sys/fs/pipe-max-size
查看任何管道的最大限制(尽管可以使用fcntl(fd, F_SETPIPE_SZ, size)
在每个管道上降低限制。)
答案 1 :(得分:1)
管道最终将填满,yes
将尝试写入并阻止等待stdout变为可用。可忽略不计的内存量(根据this answer在Linux上为64KB)将用于缓冲管道。