我有一个简单的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