命令行中的异步管道

时间:2017-10-25 18:48:30

标签: linux bash

说我有两个命令:foo和bar。

我想执行这两个操作,使得foo的输出被“重定向”到bar的输入。不仅如此,我还希望写入foo输出流的每个字节都能直接/立即写入bar的输入流。

如果我使用命令:

foo | bar

然后foo必须在bar开始读取其输入流之前终止/退出。我希望bar在foo写入其输出流的同时开始读取其输入流。

This在这里回答,如果我理解正确,说明管道缓冲的字节数有限制,当它们被填充时,管道被“刷新”到bar的输入流中不知怎的,这个限制可以减少到'1'?

1 个答案:

答案 0 :(得分:6)

您写道:

  在foo开始读取其输入流之前,

bar必须终止/退出。我希望barfoo写入其输出流的同时开始读取其输入流。

假设不正确。 foo在输出传递给bar之前不需要终止。确实是glibc(假设foobar都链接到它)执行输出缓冲。除非foo的输出发送到终端,否则输出将被写入缓冲区,并且当缓冲区达到特定大小时会刷新该缓冲区。如果foo的输出太小而无法达到缓冲区大小,那么是的,一旦foo退出,缓冲区将被刷新。

您可以使用stdbuf命令调整缓冲区大小。以下命令不会缓冲foo的输出:

stdbuf -o0 foo | bar