将C++生成的cerr和cout重定向到Ubuntu中的同一文件

Redirecting C++ generated cerr and cout to the same file in Ubuntu

本文关键字:Ubuntu 文件 重定向 cout C++ cerr      更新时间:2023-10-16

我的程序生成指向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。

在bash中,您应该执行以下操作:

./a.out source > target 2>&1

以将CCD_ 1合并为CCD_。您给出的命令适用于csh

如果你想把stdout合并成stderr,你会做

./a.out source 2> target 1>&2

./a.out source >> target 2>&1将解决您的问题
2>&1表示将标准错误(stderr)与标准输出(stdout)组合(或称为重定向)
>>意味着将程序的输出流附加到"目标"的末尾。如果使用单个>而不是stderr0,则意味着用"target"替换程序的输出流。

p.S。假设您的代码有两个不同的输出
std::cout<<"results"<<endl和一些CCD_ 12

在bash中,您可以执行./a.out source 1>>Result.txt 2>> Debug.txt
您的"结果"将存储在Result.txt中,您的"调试信息将存储在debug.txt中。
1>>意味着标准输出重定向到某个地方的后面,您也可以使用1>,这意味着标准的输出重定向到某处
2>>意味着标准错误重定向到某个地方的后面,你也可以使用2>,这意味着标准的错误重定向到的某个地方

如果您想使用脚本自动运行程序,这将非常有用。

在bash中,这应该有效:

./a.out source >target 2>&1