2017-03-23 25 views
2

我想有一個日誌文件merged.log它存儲完整的程序輸出(標準輸出和標準錯誤),所以我可以看到錯誤日誌旁邊的非錯誤日誌,但也有一個文件error.log僅適用於錯誤行,所以我可以快速查看問題該程序。我曾嘗試使用tee,但我無法弄清楚如何執行這種特定類型的重定向。如何將程序的stdout和stderr重定向到一個文件,並將同一個stderr重定向到另一個文件?

舉例來說,如果我有以下的JavaScript程序

// outputter.js 
console.log('this is stdout'); 
console.error('this is stderr'); 

那麼這兩個日誌文件應該是

# merged.log 
this is stdout 
this is stderr 

# error.log 
this is stderr 

回答

2

在BASH這個工作對我來說:

((./a.out 2>&1 1>&3 | tee error.log) 3>&1 1>&2) > merged.log 2>&1 

有一個很好的解釋this page.

+1

這將保留'stderr'和'stdout'上的消息的原始順序嗎?例如,如果你用'(ls。nonexistent; ls。nonexistent)'替換'./a.out',那就應該交織正常和錯誤輸出。如果您提到有關訂購的限制,您的答案可能是可以接受的。 – janos

+0

@janos我運行了你的建議命令,它正確地交錯stdout和stderr輸出 – almel

+0

@roger你的命令按預期工作,但經過一番搗鼓之後,我發現如果我在最後一個括號之前刪除了'1&2',我仍然在兩個日誌文件中獲得預期的輸出。爲什麼有必要將fd 1重定向到2? – almel

相關問題