将stdout / stderr重定向到多个文件

时间:2011-11-14 15:55:12

标签: bash unix stdout stderr

我想知道如何将stderr重定向到多个输出。我用这个脚本试了一下,但我无法让它工作得很好。第一个文件应该有stdout和stderr,第二个应该有错误。

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

有更好的方法吗?任何帮助将非常感激。谢谢。

3 个答案:

答案 0 :(得分:19)

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

会做你想做的事。

这有点乱,让我们一步一步地完成它。

  • 我们说过去STDERR的内容现在会STDOUT
  • 我们说过去STDOUT的内容现在会转到errorTestnormal.out。

现在,STDOUT被打印到文件中,STDERR被打印到STDOUT。我们希望将STDERR放入2个不同的文件中,我们可以使用tee。 tee将给出的文本附加到文件中,并回显到STDOUT

  • 我们使用tee附加到errorTestnormal.out,因此它现在包含STDOUT的所有STDERRscript.pl输出。
  • 然后,我们将STDOUT tee的{​​{1}}(STDERR中包含script.pl)写入errorTest.out

在此之后,errorTestnormal.out包含所有STDOUT输出,然后输出所有STDERRerrotTest.out仅包含STDERR输出。

答案 1 :(得分:2)

我也不得不捣乱这一段时间。为了在两个文件中获取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

如果你想让stdout和stderr仍然输出到屏幕上,可以省略最后的/ dev / nul 2>& 1。

答案 2 :(得分:0)

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