2011-04-21 64 views
2

這是我經常嘗試做的一項任務。 我想將stderr和stdout都記錄到日誌文件中。但我只想打印到控制檯標準錯誤。如何同步記錄stderr和stdout,但只打印標準錯誤屏幕?

我試着發球,但一旦我使用「2> & 1」合併標準錯誤和標準輸出。因爲我的管道都合併了,所以我無法將stdout打印到屏幕上。

這裏是我試過

./dosomething.sh的一個簡單的例子| tee -a log 2> & 1. 現在我對日誌和屏幕都有stderr和stdout了。

什麼想法?

基於本網站上的一些閱讀,這個問題已經被問。 Write STDOUT & STDERR to a logfile, also write STDERR to screen

而且也很類似這裏的一個問題: Save stdout, stderr and stdout+stderr synchronously

但他們都不是能夠重定向標準輸出+標準錯誤到一個日誌和錯誤輸出到屏幕上,同時stdoud和標準錯誤同步寫入日誌文件。

+0

@Tomalak的OP試圖'tee'與'2>&1'。他有什麼缺失? – chrisaycock 2011-04-21 13:50:04

+0

@chrisaycock:他使用的命令。恰恰。 – 2011-04-21 13:52:19

+0

我已經編輯了一個更精確的問題。給出一個例子,並指出關於堆棧溢出的現有問題 – Damien 2011-04-21 14:18:01

回答

5

我能夠在bash得到這個工作:

(./tmp.sh 2> >(tee >(cat >&2) >&1)) > tmp.log 

這並不在zsh中正常工作(提示不會等待進程退出),而不會在衝刺在所有的工作。一個更便攜的解決方案可能是編寫一個簡單的C程序來做到這一點。

+0

我認爲'破折號'和其他簡單的,類POSIX的shell不能表達這一點。 +1,似乎工作。 – 2011-04-21 14:22:54

+0

當我使用這個,我需要按回車回到提示。鍵入一個命令,然後輸入運行該命令。任何方式來避免這種情況? – neildeadman 2011-06-28 09:44:07

1

我設法得到這個工作,這個腳本在bash。

mkfifo stdout 
mkfifo stderr 

rm -f out 
cat stderr | tee -a out & 
cat stdout >> out & 
(echo "stdout"; 
grep; 
echo "an other stdout"; 
echo "again stdout"; 
stat) 2> stderr > stdout 

rm -f stdout 
rm -f stderr 

輸出的順序被保留。使用這個腳本,過程正確結束。

注:我用grep和統計不帶參數,生成標準輸出。

+0

接受的解決方案(來自Random832)確實在後臺執行。請參閱此處的命令不按照正確的順序打印。 $ echo line; ((echo line2; grep)2>>(tee>(cat>&2)>&1))> tmp.log; echo line3 line line3 $ Usage:grep [OPTION] ... PATTERN [FILE] ... 嘗試使用'grep --help'以獲取更多信息。 – Lynch 2011-04-23 16:29:31