2013-07-10 32 views
5

我正在使用以下代碼將stderr發送到文件。將bash stderr發送到日誌文件,但前提是存在錯誤

.script >2 "errorlog.$(date)" 

問題是,即使錯誤不存在,每次運行腳本時都會創建一個空白日誌文件。我在網上查看了一些書籍,並且只有在存在錯誤的情況下才能確定如何創建日誌文件。

回答

5

輸出重定向打開腳本運行前的文件,所以沒有辦法知道,如果該文件將收到任何輸出。你可以做什麼,但是,被立即刪除該文件,如果它捲起爲空:

logfile="errorlog.$(date)" 
# Note your typo; it's 2>, not >2 
script 2> "$logfile"; [ -s "$logfile" ] || rm -f "$logfile" 

我用-f以防萬一,彷彿$logfile不存在-s可能會失敗,不只是如果它是空的。我使用;來分離命令,因爲$logfile是否包含任何內容不取決於script是否成功。

您可以在一個功能包裝這件事,使之更易於使用。

save_log() { 
    logfile=${1:-errorlog.$(date)} 
    cat - > "$logfile" 
    [ -s "$logfile" ] || rm -f "$logfile" 
} 

script 2> >(save_log) 
script 2> >(save_log my_logfile.txt) 

沒有這麼重定向到一個文件一樣簡單,並且依賴於非標準功能(進程替換),但不是太糟糕,無論是。

+0

我創建了一個帶有錯誤的示例腳本,並使用了第一個示例。它每次都成功創建一個新的日誌文件。當我運行固定腳本時它仍然會創建一個空白日誌文件,但它不會刪除該文件。你認爲我需要改變RM部分嗎? – bkstack

+0

我明白了。我沒有放在./前面的日誌文件 我用以下來解決它。 日誌文件= 「錯誤日誌$(日期)」。 ./script 2> 「./

/$日誌文件」; [-s「./ /$ logfile」] || RM -f「./ $日誌文件」 我還添加了睡眠中的文件創建和刪除之間,以確保它在工作。感謝您的幫助chepner! 日誌文件= 「錯誤日誌$(日期)」。 ./script 2> 「./ /$日誌文件」;睡2; [-s「./ /$ logfile」] || rm -f「./ /$ logfile」 – bkstack

相關問題