刷新终端缓冲区?

刷新终端缓冲区?

我有一个(专有)程序,我从./program -a asdf终端启动它。当我这样做时,我可以在正确的时间看到所有输出。

但是,当我想在我的脚本中使用这些程序的输出并运行 时./program -a asdf | script.sh,其中“script.sh”仅包含read line循环echo $line,程序的输出是“奇怪的”。当程序打印第一行块时,脚本不会打印任何内容。当程序(几分钟后)打印第二行块时,我的脚本将打印第一行块。

为什么?

有没有办法让我的脚本“像终端一样”在终端上显示时立即获取输出?

答案1

问题是,./program -a asdf在管道中运行时,的输出会被缓冲,并且任何输出都会停留在缓冲区内,直到缓冲区满了为止。

您可以使用控制命令的输出缓冲;特别是使用无缓冲stdbuf运行:./program -a asdfstdout

stdbuf -o0 ./program -a asdf

这样你的缓冲管道就变成:

stdbuf -o0 ./program -a asdf | script.sh

相关内容