为什么 mawk 的输出 (STDOUT) 即使是终端也会被缓冲?

为什么 mawk 的输出 (STDOUT) 即使是终端也会被缓冲?

我知道通常由(但不是)、、等STDOUT命令缓冲,除非与适当的选项(即、 or 、 or )一起使用。但是当是终端/tty 时,缓冲不会发生,在这种情况下它是行缓冲的。mawkgawkgrepsedmawk --Winteractivegrep --line-bufferedsed --unbufferedSTDOUT

现在,我不明白的是为什么在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,这是预期的行为,因为grepsSTDOUT是终端:

$ 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

相关内容