这个问题看起来很幼稚,但我苦苦寻找了半个小时却找不到答案。基本上我不希望 stderr 消息潜入我的结果文件中。
$nohup ./a.out | gzip -c > result.txt.gz 2>log.txt &
nohup: ignoring input and redirecting stderr to stdout
$zcat result.txt.gz
this is stderr output.
this is stdout output.
a.out文件是由“cc test.c”从下面的test.c编译而来,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
fprintf(stderr, "this is stderr output.\n");
fprintf(stdout, "this is stdout output.\n");
return 0;
}
但我不希望 stderr 消息出现在结果文件 result.txt.gz 中。它应该在 log.txt 中,但该文件是空的。谢谢!
该错误重定向实际上适用于
gzip
命令,而不是 /.a.out
。您要找的是./a.out 2> log.txt | gzip -c > result.txt.gz
。
@fireshadow52 已经发布了一个工作解决方案,但我想添加一些细节。
管道将一个进程的
stdout
连接到另一个进程的 stdin
。也就是说,它不会将第一个命令的 stderr
通过管道传输到第二个命令的 stdin
。这意味着,就 nohup
而言,在原始命令中
nohup ./a.out | gzip -c > result.txt.gz 2>log.txt &
stderr
的 ./a.out
仍然连接到终端,因此 nohup
会为您处理重定向,并且 stderr
上的任何输出都会重定向到 nohup.out
。如果 stdout
或 stderr
仍然输出到终端,那将(可能)干扰共享终端的其他命令的输出。来自man nohup
:
如果标准输入是终端,则从不可读的文件重定向它。如果标准输出是终端,则尽可能将输出附加到“nohup.out”,否则附加到“$HOME/nohup.out”。如果标准错误是终端,则将其重定向到标准输出。要将输出保存到文件,请使用“nohup COMMAND > FILE”。
考虑到这一点,很明显你需要重定向
stderr
before 管道并最终得到 @fireshadow52 的解决方案:
nohup ./a.out 2> log.txt | gzip -c > result.txt.gz &
作为已接受答案的一个细微变化,人们还可以使用进程替换而不是管道(尽管我认为后者更具可读性):
nohup ./a.out 2> log.txt > >(gzip -c > result.txt.gz) &
在这种情况下,您希望将
stderr
和 stdout
重定向到不同的目的地,但如果您希望所有输出都通过管道,只需将 stderr
重定向到管道之前的 stdout
即可:
nohup ./a.out 2>&1 | gzip -c > result.txt.gz 2>log.txt &