将 stdout 重定向到文件,将 stderr 重定向到文件和屏幕

将 stdout 重定向到文件,将 stderr 重定向到文件和屏幕

我正在运行 valgrind 来找出程序中的错误。Valgrind 的 memcheck 会打印到 stderr。我想要做的是修改一下这个:

valgrind --tool=memcheck ./a.out >output 2>grindout

但是,我还希望 valgrind 输出显示在屏幕上。因此程序的输出全部进入文件。Valgrind 输出放置在 grindout 中并显示在屏幕上。我该怎么做?

谢谢。

答案1

您正在寻找tee命令。不幸的是,重定向 stderr 和 stdout 时存在一些技巧。以下应该有效:

valgrind --tool=memcheck ./a.out 3>&1 2>&3 >output | tee grindout

这会将标准输出重定向到,将标准错误移动到指向 stdout 的output新文件描述符。获取这个 stdout-ified stderr 并将其打印到屏幕和。3teegridnout

答案2

为此使用 tee,但您需要对 stdout / stderr 进行一些技巧。

valgrind --tool=memcheck ./a.out 2>&1 > output | tee grindout

解释:2>&1将 stderr 发送到 stdout,常规 stdout 发送到文件outputtee程序传递 stdin,但也将其保存到文件grindout

答案3

我也遇到了同样的问题。该问题是由缓冲引起的。您可以在此处阅读更多相关信息:http://mywiki.wooledge.org/BashFAQ/009

这是对我有用的解决方案:

stdbuf -o0 valgrind -v --tool=memcheck stdbuf -o0 ./a.out  2>&1 | stdbuf -o0 tee grindout

放置'stdbuf -o0'在三个被执行的程序前面的会导致它们关闭缓冲。

问题从来不是输出没有生成,也不是输出没有到达正确的地方。问题在于它没有在正确的时间到达那里(由于缓冲)

相关内容