如何将所有编译器的输出捕获到文件中?

pec*_*ker 57 linux shell makefile g++ io-redirection

我正在Linux中从源代码(CPP)构建一个开源项目.这是订单:

$CFLAGS="-g Wall" CXXFLAGS="-g Wall" ../trunk/configure --prefix=/somepath/ --host=i386-pc --target=i386-pc
$make
Run Code Online (Sandbox Code Playgroud)

编译时我收到很多编译器警告.我想开始修复它们.我的问题是如何捕获文件中的所有编译器输出?

$make > file没有做好这份工作.它只是保存编译器命令,就像g++ -someoptions /asdf/xyz.cpp我想要输出这些命令执行一样.

Joh*_*lla 107

编译器警告发生在stderr,而不是stdout,这就是为什么当你只是重定向make到其他地方时你没有看到它们.相反,如果你正在使用Bash,请尝试这样做:

$ make &> results.txt
Run Code Online (Sandbox Code Playgroud)

&意思是"重定向输出和错误到这个位置".其他壳通常具有类似的构造.

  • 这相当于`make> results.txt 2>&1`但键入较少:) (6认同)
  • @Dana the Sane:Bash 4对管道有`|&`,相当于`2>&1 |`. (4认同)
  • 请注意,>&、&> 和 2>&1 都是依赖于 shell 的,可能工作与否取决于您是否有 bash/csh 或其他 shell。@Alberto:我也很困惑,因为我使用的是 csh 并且 &> 在 >& 工作时对我不起作用。这就是原因。 (2认同)

Nat*_*idd 26

在一个bourne shell中:

make> my.log 2>&1

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


dmc*_*kee 22

到目前为止,有很多好的答案.这是一个褶边:

$ make 2>&1 | tee filetokeepitin.txt 
Run Code Online (Sandbox Code Playgroud)

会让你观看输出滚动过去.


小智 6

假设您想从构建输出中突出警告和错误:

make |& grep -E "warning|error"
Run Code Online (Sandbox Code Playgroud)


ken*_*ytm 5

输出转到stderr.使用2>捕捉到这一点.

$make 2> file
Run Code Online (Sandbox Code Playgroud)


Dav*_*ley 3

尝试make 2> file。编译器警告出现在标准错误流上,而不是标准输出流上。如果我的建议不起作用,请检查您的 shell 手册以了解如何转移标准错误。