为什么“>”不重定向来自 gcc 的错误消息?

Ale*_*lex 9 shell gcc c

我将以下程序存储在 new.c 中

int main() 
{ 
    a;
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

它返回一条错误消息。我想将此消息发送到文件。所以我使用了以下命令

gcc new.c > temp.txt
Run Code Online (Sandbox Code Playgroud)

但我仍然在终端上获得输出。我正在使用 Ubuntu 13.04。我怎样才能让它工作?

Flo*_*ris 17

当您使用 编译程序时gcc,有不同类型的输出:tostdoutstderr。通常,>会将stdout流定向到文件(例如,将 a 的结果printf("hello world\n");发送到stdout)。然而,它stderr继续被发送到屏幕上,因为它被认为是“你需要被告知的特殊情况”。

有一种方法可以将 stderr 重定向到文件 - 您可以使用以下(不是很直观)命令执行此操作:

gcc new.c &> myFile
Run Code Online (Sandbox Code Playgroud)

&>“重定向所有内容”的“bash 速记”在哪里。正如@CharlesDuffy 指出的那样,符合 POSIX 的表格是

gcc new.c > myFile 2>&1
Run Code Online (Sandbox Code Playgroud)

这意味着“编译'new.c'并发stdout送到myFile.并将stderr(2)发送到与stdout&1=“与stdout相同的地方”)的相同位置。

您可以在http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.htmlhttp://mywiki.wooledge.org/BashFAQ/055找到有关不同重定向的更多详细信息

顺便说一句,如果你想从你的程序中专门向 发送一些东西stderr,你可以使用以下命令

fprintf(stderr, "hello world - this is urgent.\n");
Run Code Online (Sandbox Code Playgroud)

如果您将其包含在程序中,运行该程序并将“正常”输出发送到文件,这仍将显示在控制台上。因此,如果您将上述内容编译为可执行文件urgent,则键入

./urgent > /dev/null
Run Code Online (Sandbox Code Playgroud)

在控制台上,您的输出将出现在屏幕上。

  • http://mywiki.wooledge.org/BashFAQ/055 可能是对重定向的更好介绍。此外,确实应该引入符合 POSIX 的格式(`>myFile 2>&1`)以及 bash 扩展(`&>`)。 (2认同)

小智 11

由于>仅重定向 stdout,并且将错误写入stderr,因此您需要改用以下方法之一:

gcc new.c &> temp.txt ## redirect both stdout and stderr using bash or zsh only
Run Code Online (Sandbox Code Playgroud)

...或者...

gcc new.c >temp.txt 2>&1 ## redirect both stdout and stderr in any POSIX shell
Run Code Online (Sandbox Code Playgroud)

&>是一个 BASH 扩展,可以同时重定向stdoutstderr到一个文件;否则,最简单的方法是首先重定向标准输出(>temp.txt),然后进行标准错误(FD 2)的已重定向文件句柄在stdout副本(FD 1),如下所示:2>&1