刷新终端缓冲区?

Flo*_*ach 5 command-line scripts output

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

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

为什么?

有没有办法让我自己的脚本“像终端一样工作”,以便在终端显示时立即获取输出?

kos*_*kos 4

问题是,./program -a asdf当在管道中运行时, 的输出会被缓冲,并且任何输出都将位于缓冲区内,直到该输出已满。

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

stdbuf -o0 ./program -a asdf
Run Code Online (Sandbox Code Playgroud)

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

stdbuf -o0 ./program -a asdf | script.sh
Run Code Online (Sandbox Code Playgroud)