如何将stderr和stdout重定向到其他文件并在终端中显示?


30

我想在终端中查看命令的输出,好像没有重定向一样。另外,stderr需要重定向到err.log,stdout需要重定向到stdout.log。

也可以在终端上单独显示一个文件,即确切显示终端中显示的内容的副本,即在错误发生时和出现时打印错误,该文件为stdouterr.log。


@Nuno不,不是。OP希望stdout和stderr具有不同的文件。
dogbane

@dogbane是的,您是对的。对于那个很抱歉。
Nuno C.Inácio

我仍然觉得这个问题很熟悉。我来看一下...这是一个非常相似的unix.stackexchange.com/q/4195/250,这是一个相关的unix.stackexchange.com/q/1416/250
phunehehe 2011年

Answers:


37

使用以下tee命令:

(cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log

3>&1 1>&2 2>&3 这是交换stderr和stdout的方式,因为tee只能接受stdout。

查看Unix tee命令,以使用更高级的重定向tee


不错的解决方案。有什么办法获取cmd退出代码?
turbanoff

2
@turbanoff替换cmd(cmd ; echo >exit_code.txt $?)
Parthian Shot

我认为这应该更好地保留输出到命令行的事物顺序:((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log)
TTT

5

我认为将stdout和stderr记录到两个不同的文件是一个绝妙的主意。它不会使日志异步吗?因此,我尝试了以下方法:

  • stdout到“ stdout.log”(如dogbane所建议)
  • stderror到“ stderr.log”(如dogbane所建议)
  • 全部输出到“ all.log”并
  • 仍然能够在显示器上看到输出(尽管在单独的终端中!)

((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log) &> all.log

在另一个航站楼

tail -f --sleep-interval=2 all.log

无法将stderr直接定向到第二个tty吗?然后,不需要日志文件。
史蒂文·卢

@StevenLu是的,如果您知道名称并且有权写入可以完成的第二个tty。
Jasen 2015年

1
更简单的方法是&| tee all.log在命令末尾而不是&> all.log
Jasen 2015年

@Jasen:我第二次看到&|。我也理解&>|&但是&|在这种情况下是什么意思?我找不到合适的语法参考,不在网上,甚至没有查阅bash手册页“ bash(1)” ... Tx
Cbhihe

1
就我所知,@ Cbhihe没有任何作用,我要说的是|&
Jasen

3

@dogbane,谢谢。
我还发现了另一种方式,可以将两个流大致按顺序保存,因为它们无需重定向即可打印。

command 2> >(tee errlog | tee -a bothLog > /dev/tty ) | tee outlog | tee -a bothLog

但这仅适用于支持进程替换的shell。


-2

尝试这个 :

command 2>&1 | tee bothLog

4
您好vasile,这不能回答问题:balki需要stdout和stderr分别使用文件,您的解决方案会将两者混合在同一流中。
2012年

人们为什么将stdout和stderr合并在一起?还是告诉别人这样做?
nurettin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.