2017-09-26 24 views
0

を更新しないI stdoutとログファイルにティースクリプトの出力に次の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" 

あなたはbashの4.1以降をお持ちの場合おかげ

+0

完全に予想されます。 'sed'は* once *で開始され、' date'は* once *実行されます - あなたはそれが他の方法ではないことを望みます。外部ツールを呼び出すのは非常に遅いので、コンテンツの実行が速い場合は、ログ処理が必ずしも追いつかなくなる可能性があります。 –

答えて

0

は、それが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を使用します。

が表示された場合は、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 
# ...................... ^^^^^^^^^^^^ 
関連する問題