rub*_*o77 3 grep io-redirection output
如果我以某种方式跟踪文件:
tail -f /var/log/syslog|grep s
Run Code Online (Sandbox Code Playgroud)
我看到所有包含“s”的行
如果我再次将其 grep 到相同的“s”,为什么这不会给出任何输出?
tail -f /var/log/syslog|grep s|grep s
Run Code Online (Sandbox Code Playgroud)
正如 Rubo77 所提到的,问题是通过添加--line-buffered到第一个 grep 命令来解决的:
tail -f /var/log/syslog|grep --line-buffered s|grep s
Run Code Online (Sandbox Code Playgroud)
但是,您可能会问,为什么单个grep命令不需要它?两者的区别在于以下命令:
tail -f /var/log/syslog|grep s
Run Code Online (Sandbox Code Playgroud)
STDOUT因为 grep 指向一个终端。 grep最有可能STDOUT通过 stdio 库中包含的函数写入。根据文档(stdio(3)):
默认情况下,引用终端设备的输出流总是行缓冲的;
因此,底层库调用在每行之后刷新缓冲区,而 grep 部分没有任何操作。
在这个命令中:
tail -f /var/log/syslog|grep --line-buffered s|grep s
Run Code Online (Sandbox Code Playgroud)
STDIO现在转到管道而不是终端设备,grep 用来写入 STDOUT 的库函数完全缓冲这些写入,而不是使用行缓冲。使用该--line-buffered标志时,grep 将调用fflush,这将刷新所有缓冲写入。