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

问题描述 投票:2回答:3

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

c++ bash cout stderr redirect
3个回答
7
投票

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

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

stderr合并到stdout。你给的命令是为了csh

如果你想将stdout合并到stderr,你会这样做

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

4
投票

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

附:假设您的代码有两个不同的输出 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>这意味着标准错误重定向到某个地方

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


1
投票

在bash中,这应该工作:

./a.out source >target 2>&1
© www.soinside.com 2019 - 2024. All rights reserved.