2017-09-26 70 views
0

我有以下bash命令腳本輸出到標準輸出和日誌文件。它的工作原理,我可以看到實時輸出。但日期並未改變。有什麼方法可以指示exec以動態的方式評估日期。bash腳本輸出到文件和標準輸出不更新時間戳

#!/bin/bash 

LOGFILE="/tmp/te/script.log" 
exec 1> >(stdbuf -e 0 -o 0 sed "s/^/$(date '+[%F %T]'): /" | tee -a ${LOGFILE}) 2>&1 

echo "Started" 
sleep 2 
echo "Done sleeping" 
sleep 2 
echo "Another sleep" 
sleep 2 

echo "Done" 

感謝

+0

完全可以預料。 'sed'開始*一次*,'date'運行*一次* - 您不希望它是其他方式;調用外部工具的速度非常慢,所以如果你的內容快速運行,日誌過程不一定會跟上。 –

回答

0

如果你有bash的4.1或更高版本,它具有通過printf %()T計算時間戳的一個非常有效的手段。因此:

logfile="/tmp/te/script.log" 
exec > >(while IFS= read -r line; do 
      printf '%([%F %T])T %s\n' -1 "$line" 
     done >>"$logfile") 2>&1 

此使用BashFAQ #1while read循環遍歷行,並且使用printf以產生與所述當前時間戳爲每個線路的輸出。

(如果你得到錯誤printf: `(': invalid format character,這意味着你的bash太舊了;你可以改爲printf '%s %s\n' "$(date '+[%F %T]')" "$line",但這會慢得多)。

3

您可能希望使用ts來添加時間戳。對於Ubuntu,apt install moreutils

exec 1> >(stdbuf -e0 -o0 ts '[%F %T]' | tee -a "$LOGFILE") 2>&1 
# ...................... ^^^^^^^^^^^^