2011-11-14 263 views
10

我想知道如何將stderr重定向到多個輸出。我用這個腳本試了一下,但是我無法讓它正常工作。第一個文件應該有stdout和stderr,第二個文件應該只有錯誤。將stdout/stderr重定向到多個文件

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

有沒有更好的方法來做到這一點?任何幫助將非常感激。謝謝。

+0

將鼠標懸停在已添加的標籤上,關注stdout/stderr = 7。如果你爲你使用的shell包含一個標籤,你會在問題上得到更多的關注,我認爲?祝你好運。 – shellter

回答

16

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

會做你想要什麼。

這有點凌亂,讓我們一步一步地通過它。

  • 我們說什麼以前去STDERR現在會去STDOUT
  • 我們說什麼以前去STDOUT現在會去errorTestnormal.out。

所以,現在,STDOUT被打印到文件,STDERR被打印到STDOUT。我們想把STDERR分成兩個不同的文件,我們可以用三通來完成。 tee將文本附加到文件中,並且還回應到STDOUT

  • 我們使用tee追加到errorTestnormal.out,所以現在包含了所有的script.plSTDOUTSTDERR輸出。
  • 然後,我們寫的teeSTDOUT(其中包含來自script.plSTDERR)爲errorTest.out

在此之後,errorTestnormal.out擁有所有STDOUT輸出,然後將所有STDERR輸出。 errotTest.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都會轉到該文件。 –

+0

好,趕快解決了。 – Jarek

0

我想在第二個「>」的情況下,您嘗試將errorTestnormal.out(而不是script.pl)的錯誤輸出發送到errorTest.out

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 

最後的/ dev/NUL 2> & 1能如果希望輸出和錯誤仍然被輸出到屏幕上被省略。