繁体   English   中英

将stderr和stdout写入一个文件,但也将stderr写入另一个文件

[英]Write stderr and stdout to one file, but also write stderr to a separate file

我有一个Shell脚本,我要将其stdout和stderr写入日志文件。 我知道这可以通过

sh script.sh >> both.log 2>&1

但是,我也想同时将stderr写入一个单独的文件“ error.log”。 这可以实现吗?

您可以使用tee将输出复制到两个位置。 结合一些棘手的重定向,然后...

script.sh 2>&1 >> both.log | tee -a both.log >> error.log

这会将stderr重定向到stdout,然后将stdout重定向到both.log stderr保留下来,并通过管道传递到tee ,然后将它复制到两个日志文件中。

为此,您需要首先切换stdout和stderr,这需要一个附加的文件描述符:

sh script.sh 3>&2 2>&1 1>&3 3>&-

最后一个运算符关闭辅助文件描述符。

之后,您可以使用tee复制错误流(现在在stdin上)并将其附加到错误日志中:

sh script.sh 3>&2 2>&1 1>&3 3>&- | tee -a error.log

然后,您可以将stdin和stderr都指向合并的日志:

(sh script.sh 3>&2 2>&1 1>&3 3>&- | tee -a error.log) >> both.log 2>&1

命令周围的括号对于捕获整个命令的错误流很重要。 没有它们,只会捕获tee命令的(空)错误流,其余的仍将流向终端。

注意:这不会检查文件描述符3之前是否已使用(打开)。 在bash中,您可以使用它来选择以前未使用的文件描述符,并在最后一次重定向时将其关闭:

sh script.sh {tmpfd}>&2 2>&1 1>&${tmpfd}-

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM