在一个 Shell 脚本中,如何将标准输出重定向到控制台并将标准输出和标准错误都重定向到一个文件中? 将标准输出重定向到控制台并将标准输出和标准错误都重定向到一个文件中的方法是什么?

6

我需要将stdout重定向到控制台,同时将stdout和stderr重定向到文件中。这需要在shell脚本内完成。我发现以下的代码可以将输出同时重定向到控制台和日志文件,现在需要将其中的stderr去除。

exec > >(tee -i "output.log") 2>&1

你能在这里帮我吗?


作为额外的复杂性,要记住stdout通常是缓冲的,而stderr通常不是。将两者重定向到一个共同的日志文件中可能会导致它们按实际时间顺序写出。解决这个问题的一种方法是取消两者的缓冲,例如通过将两者路由到stderr,但这会使您的解决方案更加复杂。为什么您不希望stderr也输出到控制台?这对我来说似乎是违反直觉的。 - Paul Hodges
是的,那正是我所思考的。特别是在多线程编程中,它可能会发现一个错误并在其他任务完成之前开始生成报告。 - Doyousketch2
3个回答

2

4
exec 2>output.log > >(tee /dev/tty >&2) 不也能做同样的事情吗? - oguz ismail
看起来是的。 - Stephan Pieterse
为什么需要两个Tee?他试图将标准错误输出到控制台上清除,以便它只会被记录。 - Doyousketch2

1
我认为你应该这样启动它:

your-command 2>&1 | tee -i "output.log"

它将同时传输标准输入和错误输出到tee -i output.log,在写入之前会回显文本。
或者,忽略错误输出(传输到/dev/null):
your-command 2>/dev/null | tee -i "output.log"

或者你可以使用带有 /dev/null 重定向的修改后的命令:

exec > >(tee -i "output.log") 2>/dev/null

1
这些都不是OP想要的。 - oguz ismail

0

它可能会像这样 something like this,但你不必把第二个也加上。

exec 1> >( tee stdout.txt ) 2> stderr.txt

输出 1 被 tee 命令分流,所以你可以在屏幕上和 stdout.txt 文件中看到它。
错误信息 2 直接被发送到 stderr.txt 文件。


1
我相信你可以使用相同的文本名称,如果你想让它们都重定向到那里,但我不知道在崩溃期间两个流如何解决。消息可能会重叠。你可以尝试一下,但对我来说听起来像《捉鬼敢死队》中的“不要交叉流”。 - Doyousketch2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接