2015-01-12 91 views
1

如何重定向我的程序,從而使輸出爲3檔,使得重定向程序輸出

  1. 標準輸出去到file1
  2. 標準錯誤去到file2
  3. 輸出和錯誤的綜合結果去在其原始爲了FILE3
  4. 雖然重定向,輸出也輸出到屏幕作爲在程序運行

我試圖

myprogram > file1 2> file2 

但這並不滿足3 & 4.

編輯:這將是更好的,如果在屏幕上顯示在打印後立即的消息。 (提高響應能力)

+0

可能的重複[如何在使用管道使用「tee」時將stderr寫入文件?](http://stackoverflow.com/questions/692000/how-do-i-write-stderr-to- a-file-while-using-tee-with-a-pipe) –

回答

3
(./foo.sh > >(tee out.log) 2> >(tee err.log >&2)) |& tee all.log 

我們在這裏做了什麼?首先,我們創建兩個子殼以運行tee out.logtee err.log,並將相應的描述符重定向到它們。我們很謹慎地將stdouterr.log重新導向stderr它所屬的地方,否則它會搞砸out.log(因爲這個想法而信貸給https://stackoverflow.com/a/692407/4323)。其次,我們將整個東西放在一個子外殼中,以便我們可以將其stdoutstderr一次性重定向到all.log,同樣使用tee同時打印到屏幕上。

一個警告是,我們正在運行的程序可能緩衝標準輸出,當它不是一個TTY/PTY(終端設備)。如果您需要在屏幕上和文件中立即輸出stdout,則可以嘗試使用unbuffer運行程序,該程序可避免此緩衝。

0

myprogram > file1 2> file2 &> file3; cat file3

或者你認爲cat file3是欺騙?

+2

這根本不起作用,因爲'&>'撤銷'>'和'2>'。 –

+0

它在我的Mac上運行得很好。 – user14717

+0

那麼它不適用於OP詢問的Linux。奇怪。我有Bash 4.1.5,你可能有一個更老的。 –