【发布时间】:2014-02-25 22:54:43
【问题描述】:
我有以下使用gcc -lstdc++ main.cpp -o main.out 编译的 C++ 程序。
#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 前加上“SUCCESS:”,在 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 的字符串都出现在发送到 STDOUT 的字符串之前。
- 为什么会出现上述情况?例如,bash 是否从右到左评估所有进程替换?
- 有什么方法可以同步这些,使字符串的顺序是 C++ 示例程序中定义的?
【问题讨论】: