如果它与终端分离,我如何要求 nohup 不要将 stderr 重定向到 stdout?

How do I ask nohup not to redirect stderr to stdout if it is detached from terminal?

这个问题看起来很幼稚,但经过半小时的密集搜索,我找不到答案。基本上我不希望 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 &
./a.out

stderr 仍然连接到终端,因此 nohup 会为您处理重定向,stderr 上的任何输出都会重定向到 nohup.out。如果 stdoutstderr 仍然输出到终端,那将(可能)干扰共享终端的其他命令的输出。来自 man nohup:

If standard input is a terminal, redirect it from an unreadable file. If standard output is a terminal, append output to 'nohup.out' if possible, '$HOME/nohup.out' otherwise. If standard error is a terminal, redirect it to standard output. To save output to FILE, use 'nohup COMMAND > FILE'.

考虑到这一点,很明显您需要在 管道之前重定向 stderr 并最终得到 @fireshadow52 的解决方案:

nohup ./a.out 2> log.txt | gzip -c > result.txt.gz &

作为已接受答案的细微变化,也可以使用进程替换而不是管道(尽管我认为后者更具可读性):

nohup ./a.out 2> log.txt > >(gzip -c > result.txt.gz) &

在这种情况下,您希望将 stderrstdout 重定向到不同的目的地,但是如果您希望所有输出都通过管道,只需将 stderr 重定向到 stdout 在管道之前:

nohup ./a.out 2>&1 | gzip -c > result.txt.gz 2>log.txt &