如何在不缓冲stdout和stderr的情况下记录输出

时间:2009-02-17 19:03:07

标签: logging makefile stderr buffering

我遇到从自动构建记录到输出的问题。

使用Makefile和makefile实用程序完成构建。

问题是编译器命令行之类的正常输出转到stdout并且编译错误转到stderr。

我想从屏幕上显示的构建中获取输出。如下所示:

(stdout) CC -c file.cpp
(stderr) Compile error at file.cpp line 232, blah blah blah
(stdout) CC -c file2.cpp

我尝试过(来自ksh脚本):

make -k> build.log 2> build.log

这导致单个日志文件,但问题是流被缓冲,因此日志文件中的结果全部混淆。

我可以将输出捕获到2个单独的日志文件中,但之后我就没有关于如何将它们粘合到一个日志文件中的信息。

在这种情况下,有没有办法关闭stdout和stderr的缓冲?

4 个答案:

答案 0 :(得分:24)

make -k > build.log 2>&1

这应该对你更好,因为它不是单独重定向stderr和stdout,而是将stderr重定向到stdout,这应该使缓冲同步。

如果要将其记录到文件中并将其打印到控制台:

make -k 2>&1 | tee build.log

答案 1 :(得分:5)

试试这个

make -k > build.log 2>&1

答案 2 :(得分:0)

  

我可以将输出捕获到2   单独的日志文件但我会   没有关于如何粘合它们的信息   一起放入一个日志文件。

将它们粘合在一起很棘手,但也有正确的答案,而且它有效!请参阅Vivek Gite的“How do I save or redirect stdout and stderr into different files?”。

答案 3 :(得分:-2)

函数setbuf(标准输出,NULL); - >关闭stdout缓冲