我有一个(专有)程序,我从./program -a asdf
终端启动它。当我这样做时,我可以在正确的时间看到所有输出。
但是,当我想在我的脚本中使用这些程序的输出并运行 时./program -a asdf | script.sh
,其中“script.sh”仅包含read line
循环echo $line
,程序的输出是“奇怪的”。当程序打印第一行块时,脚本不会打印任何内容。当程序(几分钟后)打印第二行块时,我的脚本将打印第一行块。
为什么?
有没有办法让我的脚本“像终端一样”在终端上显示时立即获取输出?
答案1
问题是,./program -a asdf
在管道中运行时,的输出会被缓冲,并且任何输出都会停留在缓冲区内,直到缓冲区满了为止。
您可以使用控制命令的输出缓冲;特别是使用无缓冲stdbuf
运行:./program -a asdf
stdout
stdbuf -o0 ./program -a asdf
这样你的缓冲管道就变成:
stdbuf -o0 ./program -a asdf | script.sh