簡體   English   中英

Linux將連續輸出作為命令行參數傳遞

[英]Linux passing continuous output as command line args

我有一個機器視覺程序( ./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連續輸出./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生成足夠的輸出時detectUpdateHomeML在執行acceptInput同時連續運行detectUpdateHomeML 這應該可以解決您的問題。

您沒有以正確的方式進行操作。 由於./detectUpdateHomeML一直在運行並輸出事件信息,因此它必須是acceptInput的標准輸入,而不是后者的命令行參數列表。 然后,將它們鏈接到管道中,而不要使用反引號:

./detectUpdateHomeML | ./acceptInput

您不應該使用命令行和反引號的原因是,當您這樣做時,。/ ./acceptInput甚至要在./detectUpdateHomeML終止並生成其所有輸出后才運行。

另外,在...

std::cout << " " << cascadeName << " " << timeFound() << endl;
std::cout << std::flush;

...第二行是不必要的,因為endl輸出換行符然后進行刷新,因此您要刷新已知的空緩沖區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM