我正在获取一个脚本的输出,然后将此输入传输到 grep 并将 grep 的输出传输到另一个脚本中:
./script1 | grep 'expr' | ./script2
但是,第二个脚本永远不会获得任何输入。同样,当我script2
用cat
和script1
with替换时,不会打印任何内容ping
:
ping localhost | grep localhost | cat
如果我替换grep
为awk
:
ping localhost|awk '{print $1}'|cat
到底是怎么回事?
答案1
grep
正在缓冲(因为它确定其输出不是终端;严格来说,这是 C 库的行为)。
要禁用此功能,请运行它unbuffer -p
(从标准输入读取数据-p
是必要的):unbuffer
ping localhost | unbuffer -p grep localhost | cat
或告诉grep
按行缓冲(如果支持的话):
ping localhost | grep --line-buffered localhost | cat