我想在终端中查看命令的输出,就好像没有重定向一样。另外,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。