据我所知,如果我们举例如“./program | grep someoutput”,它会在程序处理结束后进行。你知道吗,收入怎么做?
答案 0 :(得分:2)
shell将同时生成两个进程,并将第一个的输出连接到第二个的输入。如果您有两个长时间运行的进程,那么您将在进程表中看到这两个进程。没有中间步骤,没有来自第一个程序的数据存储。它是管道,而不是管道。
注意 - 可能会涉及一些缓冲。
答案 1 :(得分:1)
你错了。
管道立即收到数据,但当然,如果另一端(接收器)没有足够快地读取数据,源进程写入管道可能会阻塞。
当然,这并不一定意味着管道适用于“实时硬”。使用,但也许这不是你的意思。
答案 2 :(得分:1)
实际上,grep可以“实时”使用,因为通过管道传输的数据不会被缓冲,因此像tail -f /var/log/messages | grep something
这样的东西会起作用。
如果您没有获得预期的输出,则前面的命令更可能是缓冲其输出。以双grep:
为例tail -f /var/log/messages | grep something | grep another
自grep will buffer its output when stdout is not connected to a terminal以来,输出不会立即出现,这意味着第二个grep在刷新缓冲区之前不会看到任何数据。强制行缓冲模式解决了这个问题:
tail -f /var/log/messages | grep --line-buffered something | grep another
根据缓冲的执行方式,可以使用stdbuf修改命令的缓冲模式,例如:
stdbuf -oL ./program | grep something