我有一个机器视觉程序(./detectUpdateHomeML
),它使用以下代码连续将找到的对象名称输出到终端:
circle( img, center, radius, color, 3, 8, 0 );
if (circle) {
std::cout << " " << cascadeName << " " << timeFound() << endl;
std::cout << std::flush;
}
int timeFound() {
time_t rawtime;
struct tm * timeinfo;
char buffer [80];
time (&rawtime);
timeinfo = localtime (&rawtime);
strftime (buffer,80," %Y-%m-%dT%H:%M:%S",timeinfo);
std:cout << (buffer);
eventCount++;
}
我希望将此输入作为命令行参数发送给使用后引号的第二个程序,以捕获输出并将其发送给另一个程序,如下所示:
./acceptInput `./detectUpdateHomeML`
但是,这些参数似乎并没有传递给
./acceptInput
。我有一个称为
./testInput
的测试程序,该程序仅打印Hello World!
,如下所示:std::cout << "Hello World!";
使用相同的命令时:
./acceptInput `./testInput`
该计划的工作和预期成果:
There are 3 arguments:
0 ./acceptInput
1 Hello
2 World!
当我尝试将连续输出从
./detectUpdateHomeML
传递到./acceptInput
程序时出了什么问题? 最佳答案
看来detectUpdateHomeML
产生了要使用acceptInput
处理的事件。在这种情况下,您的数据流中会有轻微的不匹配,可以使用xargs
解决,如下所示:
./detectUpdateHomeML | xargs -n2 ./acceptInput
当执行带有参数的程序时,父进程(例如
bash
)需要在开始执行之前知道有多少个参数,所以当您执行./acceptInput `./detectUpdateHomeML`
bash
必须等到detectUpdateHomeML
完成运行后才能启动acceptInput
。为了在仍运行时使用
detectUpdateHomeML
的输出,请使用管道:./detectUpdateHomeML | ...
这会将输出从
detectUpdateHomeML
重定向到某些程序的标准输入。xargs
在其输入中接受以空格分隔的文本,并执行子过程以将此文本作为参数。使用-n
决定每次传递多少个参数,例如2
:./detectUpdateHomeML | xargs -n2 ...
xargs
还采用要执行的子流程的名称:./detectUpdateHomeML | xargs -n2 ./acceptInput
现在,每次
detectUpdateHomeML
生成两项输出时,就会以这两项作为参数执行acceptInput
。每次
detectUpdateHomeML
生成足够的输出时,这将使您在执行acceptInput
的同时连续运行detectUpdateHomeML
。这应该可以解决您的问题。