我知道通常由(但不是)、、等STDOUT
命令缓冲,除非与适当的选项(即、 or 、 or )一起使用。但是当是终端/tty 时,缓冲不会发生,在这种情况下它是行缓冲的。mawk
gawk
grep
sed
mawk --Winteractive
grep --line-buffered
sed --unbuffered
STDOUT
现在,我不明白的是为什么在STDOUT
发送到管道的循环之外进行缓冲,即使最终目的地是终端。
一个基本的例子:
$ while sleep 3; do echo -n "Current Time is ";date +%T; done | mawk '{print $NF}'
^C
很长一段时间没有任何反应,因为mawk
似乎正在缓冲它的输出。
我没想到会这样。mawk
的输出是终端,那么为什么它是STDOUT
缓冲的呢?
事实上,使用该-Winteractive
选项,输出每 3 秒渲染一次:
$ while sleep 3; do echo -n "Current Time is ";date +%T; done | mawk -Winteractive '{print $NF}'
10:57:05
10:57:08
10:57:11
^C
现在,这种行为显然是mawk
相关的,因为如果我使用 example ,它就不会重现grep
。即使没有它的--line-buffered
选项,grep
也不缓冲它STDOUT
,这是预期的行为,因为grep
sSTDOUT
是终端:
$ while sleep 3; do echo -n "Current Time is ";date +%T; done | grep Current
Current Time is 11:01:44
Current Time is 11:01:47
Current Time is 11:01:50
^C
答案1
这并不是说它正在缓冲它输出。
mawk
是我所知道的唯一可以缓冲其内容的实用程序输入。
也可以看看https://github.com/ThomasDickey/original-mawk/issues/41#issuecomment-241070898
换句话说,mawk
在积累了一个充满输入的缓冲区之前,不会开始处理其输入(如果该处理涉及打印,更不用说打印任何内容)。
您可以通过运行来验证它:
(echo 1; sleep 1; echo 2) | mawk '{system("echo "$1)}'
可以使用该-Winteractive
选项禁用它。请注意,对于-Winteractive
,记录都是行,无论 的值如何RS
。