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

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

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

如果能在单独的文件 stdouterr.log 中获得终端中显示内容的精确副本(即发生时打印的错误),那就太好了。

答案1

使用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

答案2

我认为将 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

答案3

@dogbane,谢谢。
我还找到了另一种方法,它可以大致按顺序保存两个流,因为它们将在不重定向的情况下打印。

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

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

相关内容