我的程序生成的输出都指向std :: cout和std :: cerr。当我正常运行测试文件时,如
./a.out <source> &> <target>
target按照./a.out生成的顺序捕获两种类型的输出。
当尝试为简单的单元测试框架自动测试输出时,我在bash脚本中实现了上述内容:
`rm $OUT_NAME`
`./a.out $NEW_UNIT &> $OUT_NAME`
(带有明显的变量名称)。发送到cout的输出打印正常;但发送给cerr的那个打印不正确(有些打印;然后打印停止,没有错误)。如果你想知道,我首先添加'rm'只是为了完全确定覆盖/附加到旧版本没有问题。
有什么想法吗?
我的系统: Ubuntu 12.04。
答案 0 :(得分:7)
在bash中,您应该执行以下操作:
./a.out source > target 2>&1
将stderr
合并到stdout
。您提供的命令适用于csh
。
如果你想将stdout
合并到stderr
,你会做
./a.out source 2> target 1>&2
答案 1 :(得分:4)
./a.out source >> target 2>&1
可以解决您的问题
2>&1
表示组合(或称为重定向)标准错误(stderr)与标准输出(stdout)
>>
表示将程序的输出流附加到“目标”的末尾。如果您使用单个>
而不是>>
,则意味着用“目标”替换程序的输出流。
P.S。
假设您的代码有两个不同的输出
std::cout<<"results"<<endl
还有一些std::cerr<<"debug information"<<endl
在bash中,您可以执行./a.out source 1>>Result.txt 2>> Debug.txt
您的“结果”将存储在Result.txt中,您的“调试信息”将存储在Debug.txt中。
1>>
表示标准输出重定向到某个地方的后面,您也可以使用1>
,这意味着标准输出重定向到某个地方
2>>
表示标准错误重定向到某个地方的后面,您也可以使用2>
,这意味着标准错误重定向到某个地方
如果您想使用脚本自动运行程序,那将非常有用。
答案 2 :(得分:1)
在bash中,这应该有效:
./a.out source >target 2>&1