将标准输出/错误重定向到多个文件

13

我想知道如何将stderr重定向到多个输出。 我尝试了这个脚本,但我无法使其正常工作。 第一个文件应该同时具有stdout和stderr,而第二个文件则只应具有错误。

perl script.pl &> errorTestnormal.out &2> errorTest.out

有更好的方法吗?非常感谢您的帮助。谢谢。


将鼠标悬停在您添加的标签上,stdout/stderr 的关注者总数为 7。如果您包含您正在使用的 shell 的标签(我假设是 bash),那么您的问题将会得到更多人的关注。祝好运。 - shellter
3个回答

23

perl script.pl 2>&1 >errorTestnormal.out | tee -a errorTestnormal.out > errorTest.out

这段代码有点混乱,让我们逐步来看。

  • 我们说原本要输出到STDERR的信息现在会输出到STDOUT
  • 我们说原本要输出到STDOUT的信息现在会输出到errorTestnormal.out

现在,STDOUT会被打印到一个文件中,而STDERR会被打印到STDOUT中。我们想把STDERR放入两个不同的文件中,可以使用tee命令。tee将它接收到的文本附加到一个文件中,并同时输出到STDOUT

  • 我们使用teeSTDOUT输出内容附加到errorTestnormal.out文件中,所以现在该文件中包含了script.pl的所有STDOUTSTDERR输出。
  • 然后,我们将teeSTDOUT(即包含script.plSTDERR)写入到errorTest.out文件中。

执行完毕后,errorTestnormal.out文件包含所有的STDOUT输出,然后是所有的STDERR输出。而errorTest.out文件只包含STDERR输出。


1
你是一位学者和绅士。非常棒的回答,非常感谢 :) - kevin948
2
不需要使用fd 3。你可以简单地执行:perl script.pl 2>&1 >errorTestnormal.out | tee ... 第一个重定向将fd 2(stderr)与管道相关联,第二个将stdout重定向到文件。如果你执行:perl script.pl > errorTestnormal.out 2>&1,则stderr和stdout都会写入文件。 - William Pursell

3

我也曾经在这方面耗费了一些时间。为了将stderr输出到两个文件中,同时只将stdout输出到一个文件中(例如将stderr输出到errors.log和output.log,然后将stdout只输出到output.log),并且按照发生的顺序排序,下面的命令更好:

((sh test.sh 2>&1 1>&3 | tee errors.log) 3>&1 | tee output.log) > /dev/null 2>&1

如果您希望标准输出和错误输出仍然显示在屏幕上,则可以省略最后的“/dev/null 2>&1”。

0

我猜在第二个">"的情况下,您尝试将errorTestnormal.out(而不是script.pl)的错误输出发送到errorTest.out


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接