如何在bash中实时地从子进程读取标准输出



我有一个简单的c++程序,它从0计数到10,每1秒增加一次。当值增加时,它被写入标准输出。这个程序有意使用printf而不是std::cout。我想从bash脚本调用这个程序,并在将值写入标准输出时对其执行一些函数(例如echo)。然而,我的脚本等待程序终止,然后同时处理所有的值。

c++掠夺:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int ctr = 0;
for (int i = 0; i < 10; ++i)
{
printf("%in", ctr++);
sleep(1);
}
return 0;
}

Bash脚本:

#!/bin/bash
for c in $(./script-test)
do
echo $c
done

是否有另一种方法来读取我的程序的输出,将访问它的实时,而不是等待进程终止。注意:c++程序是一个演示示例-我使用的实际程序也使用printf,但我无法对该代码进行更改,因此解决方案需要在bash脚本中。

很多谢谢,斯图尔特

正如您正确观察到的,$(command)等待command的整个输出,分割该输出,然后才开始for循环。

要尽快读取输出,请使用while read:

./script-test | while IFS= read -r line; do
echo "do stuff with $line"
done

或者,如果您需要在循环之后访问变量,并且您的系统支持<()

while IFS= read -r line; do
echo "do stuff with $line"
done < <(./script-test)
# do more stuff, that depends on variables set inside the loop

使用管道可能更幸运:

#!/bin/bash
./script-test | while IFS= read -r c; do
echo "$c"
done

相关内容

  • 没有找到相关文章

最新更新