我将以下程序存储在 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,有不同类型的输出:tostdout和stderr。通常,>会将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.html和http://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)
在控制台上,您的输出将出现在屏幕上。
小智 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 扩展,可以同时重定向stdout和stderr到一个文件;否则,最简单的方法是首先重定向标准输出(>temp.txt),然后进行标准错误(FD 2)的已重定向文件句柄在stdout副本(FD 1),如下所示:2>&1。
| 归档时间: |
|
| 查看次数: |
10005 次 |
| 最近记录: |