Bash 不等待管道后的完整结果,而是立即对直接输出采取行动
Bash not waiting for full results after pipe but immediate action on direct output
当使用 grep -r "something" .
时,它会在找到内容时打印输出。
每当之后使用管道进行后处理时,它都会等待直到收到所有输出。
是否有某种方法/语法可以在每行可用时进行管道传输?
不要费心改进这个例子,它真的只是一个例子:
grep -r "something" . | grep -v "somethingelse" # excluding somethingelse
结果只会在搜索完所有内容后出现(因为管道 |
),但我正在寻找可以在 grep -r "something" .
的每一行上响应的语法作为 "line becomes available".
可以通过管道传输到等待输入并处理到达它的任何内容的程序,但是使用管道只会在完成时向它发送数据?
有人知道吗?
使用grep
的--line-buffered
选项:
--line-buffered
Force output to be line buffered. By default, output is line
buffered when standard output is a terminal and block buffered
otherwise.
对于 grep
,您可以使用 --line-buffered
选项。如果程序没有类似选项,可以使用stdbuf
程序,例如:
tail -f access.log | stdbuf -oL cut -d ' ' -f1 | uniq
在此示例中,stdbuf
运行 cut
程序,其输出流被修改为行缓冲。
当使用 grep -r "something" .
时,它会在找到内容时打印输出。
每当之后使用管道进行后处理时,它都会等待直到收到所有输出。
是否有某种方法/语法可以在每行可用时进行管道传输?
不要费心改进这个例子,它真的只是一个例子:
grep -r "something" . | grep -v "somethingelse" # excluding somethingelse
结果只会在搜索完所有内容后出现(因为管道 |
),但我正在寻找可以在 grep -r "something" .
的每一行上响应的语法作为 "line becomes available".
可以通过管道传输到等待输入并处理到达它的任何内容的程序,但是使用管道只会在完成时向它发送数据?
有人知道吗?
使用grep
的--line-buffered
选项:
--line-buffered Force output to be line buffered. By default, output is line buffered when standard output is a terminal and block buffered otherwise.
对于 grep
,您可以使用 --line-buffered
选项。如果程序没有类似选项,可以使用stdbuf
程序,例如:
tail -f access.log | stdbuf -oL cut -d ' ' -f1 | uniq
在此示例中,stdbuf
运行 cut
程序,其输出流被修改为行缓冲。