我需要运行一个名为pg.sh的程序。它将stdout报告到输出日志。如何将stdout以及stderr和stdout都保存到2个单独的日志文件中?
我搜索并获得了以下代码
(pg.sh 2>&1 1>&3 ) 3>&1 1>&2 | tee output.log) > final.log 2>&1
我知道1和2是指向stdout和stderr的文件描述符。 3是另一个指向stdout的文件描述符。
上面的代码可以正常工作,但是我不知道该如何实现。有人可以帮我编写代码吗?
答案 0 :(得分:5)
从外部重定向( .. ) 3>&1 1>&2
开始,顺序很重要:
那么|
输入就是fd 3,而stderr没有被tee捕获,
嵌套重定向:
fd 1重定向到fd 3(已重定向到外部stdout)
作为tee复制记录的输出,(最终重定向>final.log 2>&1
,因为fd 2在fd 1之后打开,它们都都重定向到final.log)
文件final.log将包含程序stdout和stderr,但output.log仅包含stdout。
使用3>&1 1>&2 2>&3
颠倒stdout和stderr,也许写起来更容易。
以下应该做同样的事情:
( pg.sh | tee output.log ) >final.log 2>&1
以下将程序stdout写入output.log stderr到error.log,并将两者都写入final.log。
( ( pg.sh | tee output.log ) 3>&1 1>&2 2>&3 | tee error.log ) >final.log 2>&1