完全なbashスクリプトを記録し、各行にタイムスタンプを追加します。

完全なbashスクリプトを記録し、各行にタイムスタンプを追加します。

自動更新用のbashスクリプトがあります。このスクリプトのすべての出力を記録し、各行の前にタイムスタンプを追加したいと思います。すでに持っているものにこれを追加する方法がわかりません。

LOGFILE="logdir/update.sh.$(date +%Y-%m-%d_%H:%M).log"
exec 1>$LOGFILE 2>&1

これは私のスクリプトの出力をファイルに正しくリダイレ​​クトしますが(明らかに)日付を行に追加しません。これをどのように追加できますか?

たとえば、私が記録したい出力は次のようになります。

[2019-11-07 1:43:45 PM]: Ign http://security.debian.org jessie/updates InRelease

私はスクリプトの各コマンドの前に何も追加したくなく、スクリプト全体にグローバルにタイムスタンプを取り、1つのコマンドから出てくるすべての出力行を記録したいと思います。

ベストアンサー1

タイムスタンプを追加するプログラムでスクリプトの標準出力をリダイレクトし、次のコマンドを使用できますexectsこの回答、次のように動作する必要があります。

#!/bin/bash
logfile="logdir/update.sh.$(date +%Y-%m-%d_%H:%M).log"
exec 1>> >(ts '[%Y-%m-%d %H:%M:%S]' > "$logfile") 2>&1
echo doing some real work...

ここで、プロセスの置き換えは通常のパイプと組み合わせることができないことを除いて、パイプと少し似ていますexec。標準機能ではありませんが、Bash、ksh、zshなどのより強力なシェルで使用できます。

もちろん除外、ts当然除外、質問に対する回答除外コマンド出力の各行の前にタイムスタンプを追加します。

おすすめ記事