如何将编译器的所有输出内容保存到文件中?

69

我在Linux中从源代码构建一个开源项目(CPP)。以下是步骤:

$CFLAGS="-g Wall" CXXFLAGS="-g Wall" ../trunk/configure --prefix=/somepath/ --host=i386-pc --target=i386-pc
$make

编译时出现了许多编译器警告,我想开始修复它们。我的问题是如何将所有编译器输出保存到文件中?

$ make > file不能完成工作。它只是保存了编译命令,如g++ -someoptions /asdf/xyz.cpp ,我想要这些命令执行后的输出。


1
autoconf维护者推荐的最佳实践是以不同的方式执行第一个命令:使用'../trunk configure CFLAGS="-g Wall" CXXFLAGS="-g Wall" ...'。也就是说,不要在环境中设置C{XX,}FLAGS,而是将其作为configure的参数。 - William Pursell
@William Pursell,我认为“pecker”是美元符号'$',我想它被用于表示命令行提示符,因为它在第二行(_$make_)中的使用方式,只是通常没有在提示符后加上空格。 - mctylr
@mctylr "$ FOO=x cmd" 与 "$ cmd FOO=x" 非常不同。在前者中,cmd 在环境中以 FOO 设置为 "x" 运行。而在后者中,字符串 "FOO=x" 是 cmd 的一个参数。 - William Pursell
同意。鉴于提问者可能是新手,我试图温和一些。 - mctylr
11个回答

128

编译器警告会在stderr上出现,而不是stdout,所以当你只重定向make到其他地方时,你看不到它们。如果你使用的是Bash,请尝试以下方法:

$ make &> results.txt

& 意味着“将标准输出和标准错误重定向到此位置”。其他Shell通常也具有类似的结构。


7
这等同于使用更少的键入操作完成make > results.txt 2>&1的效果 :) - ephemient
1
有没有管道的等效物? - Dana the Sane
4
Bash 4中有一个名为|&的管道符号,它等同于2>&1 | - ephemient
3
请注意,> &、&> 和 2>&1 都依赖于不同的 shell,根据您是否使用 bash/csh 或其他 shell,可能有效或无效。@Alberto:我也很困惑,因为我使用的是 csh,&> 对我没有用,而 >& 有用。这就是原因。 - Piyush Soni
@PiyushSoni:我之前在使用csh时,&> 不起作用,而 >& 起作用。 - Steven Lee

29
在Bourne Shell中:
make > my.log 2>&1

>stdout 重定向,2>&1stderr 重定向到与 stdout 相同的位置。

28

迄今为止有很多好的答案。这里有一个花边:

$ make 2>&1 | tee filetokeepitin.txt 

这将允许您观看输出内容的滚动。


1
我认为管道的返回代码通常是最后一个命令的返回代码;在这种情况下,tee而不是make。因此,|| more不幸地没有做你所说的事情。将false || echo $?false | cat || echo $?进行比较。 - ephemient
@ephemient: 啊,你说得对...我曾经让它工作,但现在我想不起来怎么做了。无论如何,在这个应用程序中,我经常使用tee - dmckee --- ex-moderator kitten
shopt -s pipefail,也许? - ephemient

7
输出已经发送到了stderr。使用2>来捕获它。
$make 2> file

6
假设您希望从构建输出中突出显示警告和错误:
假设您想要从构建输出中突出显示警告和错误:
make |& grep -E "warning|error"

1
虽然只有代码的答案并不被禁止,但请理解这是一个问答社区,而不是众包社区。通常情况下,如果提问者已经理解了作为答案发布的代码,他/她本来就会自己想出类似的解决方案,并且不会首先发布问题。因此,请通过解释如何和/或为什么它起作用来为您的答案和/或代码提供上下文 - CosmicGiant

4

根据@dmckee之前的回复

make | tee makelog.txt

这将为您提供实时滚动输出,同时编译并写入makelog.txt文件。

3

来自http://www.oreillynet.com/linux/cmd/cmd.csp?path=g/gcc

这是一个关于GCC的链接,GCC是GNU编译器套件的缩写,是一款广泛使用的免费软件编译器。

The > character does not redirect the standard error. It's useful when you want to save legitimate output without mucking up a file with error messages. But what if the error messages are what you want to save? This is quite common during troubleshooting. The solution is to use a greater-than sign followed by an ampersand. (This construct works in almost every modern UNIX shell.) It redirects both the standard output and the standard error. For instance:

$ gcc invinitjig.c >& error-msg
请看这里,如果有帮助的话: 另一个论坛

3

尝试使用make 2> file。编译器警告会输出到标准错误流,而不是标准输出流。如果我的建议不起作用,请查看您的Shell手册以了解如何重定向标准错误。


2
C shell中,&符号在大于号后面。
make >& filename

2
下面的命令将 'make' 命令的输出记录到文件 'gnu_make.log' 中。
script gnu_make.log -c "make"

这个文件可能包含 DOS 格式的行终止符,可以使用以下命令来删除它们。

dos2unix gnu_make.log

该文件可能包含颜色转义序列,当使用“cat”命令查看时可以正常工作,但如果想要删除这些序列,则可以使用以下命令进行操作

sed -i $'s/\e\\[[0-9;:]*[a-zA-Z]//g' gnu_make.log

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