我有用gcc -lstdc++ main.cpp -o main.out
編譯的以下C++程序。可以在bash中處理重定向嗎?
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(int argc, char** argv) {
cerr << "Error 1" << endl;
cout << "Ok " << endl;
cerr << "Wowza... that's bad..." << endl;
cerr << "Caused by X.";
cout << "All good in the end." << endl;
return 0;
};
我也有一個bash腳本如下,它的主要目的是與前綴STDOUT「成功」和STDERR與「ERROR」。
./main.out > >(sed "s/^/SUCCESS: /g" >> main.log) 2> >(sed "s/^/ERROR : /g" >> main.log)
如果我cat main.log
結果是:
ERROR : Error 1
ERROR : Wowza... that's bad...
ERROR : Caused by X.
SUCCESS: Ok
SUCCESS: All good in the end.
正如你所看到的,發送到stderr所有的字符串發送到標準輸出字符串之前出現。
- 爲什麼會出現上述情況?例如,bash是否評估從右到左的所有過程替換?
- 有沒有什麼方法可以同步這些,這樣字符串的順序就是C++示例程序中定義的順序?
壞消息是行的交錯是隨機的(如你的三個例子用相同的命令,但輸出不同)? – magnus
@ user1420752是的。有效隨機。如果您想讓我詳細說明我的最後一段,請告訴我。這需要我花一些時間來爲此舉一個例子。 –
我可以說......你是一個傳奇人物。我認爲自己在Linux方面非常熟練,但你的答案是現成的。我希望有一種更簡單的方法來實現我想要的功能,例如,如果bash具有使用'>()'語法在進程間交替的功能。我也試過'rm main.log; ./main.out>>(sed「s/^/$(date +%s。%N)SUCCESS:/ g」>> main.log)2>>(sed「s/^/$(date + s。%N)錯誤:/ g「>> main.log);貓main.log;同步 ; sort -nk1 main.log'但程序執行速度如此之快(或者定時器分辨率非常不準確),以至於每個進程重定向只有一個時間值。 – magnus