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

11

我在自动化构建中遇到了一个记录输出的问题。

使用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

这会生成一个单一的日志文件,但问题是这些流被缓冲了,所以日志文件中的结果全部混在了一起。

我可以将输出捕获到两个单独的日志文件中,但那样我就无法知道如何将它们粘合成一个单一的日志文件。

在这种情况下有没有办法关闭标准输出和标准错误的缓冲区?

4个回答

29
make -k > build.log 2>&1

这样做应该会更好,因为它不是分别重定向标准错误和标准输出,而是将标准错误重定向到标准输出,这应该使缓冲同步。

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

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

嗨,Ryan,它运行得很好,但我有一个问题,如何在制作时同时记录和查看消息?您的命令只记录消息。谢谢。 - Loi Dang
1
@LoiDang 更新了一个同时处理文件和控制台的替代方案。 - Ryan Graham

5

试试这个

make -k > build.log 2>&1

0

-2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接