[英]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.