2012-11-16 57 views
2

我想要做以下;Bash - 重定向stdout登錄和屏幕stderr只有日誌

  1. 將stdout的副本重定向到日誌文件並在屏幕上保留stdout。
  2. 將stderr重定向到相同的日誌文件並且不顯示在屏幕上。

沒有標準輸出代碼篩選

#!/bin/bash 
exec 1> >(sed -u 's/^/INF: /' >> common.log) 
exec 2> >(sed -u 's/^/ERR: /' >> common.log) 
echo "some txt" 
echo "an error" >&2 
echo "some more txt" 
echo "one more error" >&2 

日誌

INF: some txt 
INF: some more txt 
ERR: an error 
ERR: one more error 

第一個問題是緩衝,我試圖用sed的 '-u' 無緩衝的否定。

代碼標準輸出到屏幕:在屏幕掛

#!/bin/bash 
exec 1> >(sed -u 's/^/INF: /' | tee -a common.log) 
exec 2> >(sed -u 's/^/ERR: /' >> common.log) 
echo "some txt" 
echo "an error" >&2 
echo "some more txt" 
echo "one more error" >&2 

結果(不得不按Ctrl-C)和日誌仍然緩衝。建議?

回答

2

這是否適合您?

command 2> >(sed -u 's/^/ERR: /' >> common.log) | sed -u 's/^/INF: /' | tee -a common.log 

其中command是你的命令。

+0

對於給定的命令是的,但我希望整個命名空間因此使用exec。我可以在{}或函數本身中封裝特定的部分,並使用您的解決方案,但這並不理想。 – koola

+0

鑑於沒有更好的選擇,我將此標記爲答案。 – koola

相關問題