我有一个机器视觉程序(./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。这应该可以解决您的问题。

09-25 21:15