web-dev-qa-db-ja.com

bash +標準出力とエラーを両方のログに書き込む

私のbashスクリプトでは、標準出力と標準エラーからlog.txtにすべてを書き込むために、次のアプローチを使用します。

export LOG=/tmp/installation/log.txt

exec > $LOG 2>&1

したがって、すべてが/tmp/installation/log.txtに書き込んでいます。

しかし、2つの異なるログパスへの書き込みを行う方法

同じ標準出力と標準エラーの両方を2つのログファイルに書き込みたいとしましょう

では、この場合の構文はどうですか?

export LOG=/tmp/installation/log.txt
export LOG_I=/tmp/installation/log_info.txt

したがって、両方のログは同じコンテンツを取得します

私たちはこのようにすることができますか?

export LOG=/tmp/installation/log.txt
export LOG_I=/tmp/installation/log_info.txt

exec > $LOG $LOG_I 2>&1
2
yael

あなたの命令

exec > $LOG $LOG_I 2>&1

それはと同じなので、完全には機能しません

exec $LOG_I > $LOG 2>&1

つまり、引用符で囲まれていない$LOG_Iの展開によって与えられたコマンドをexecしようとします。


データを複数のファイルに入れるには、データを複製する必要があります。これはteeで行われます。

例えば、

log1="/tmp/logfile-1.txt"
log2="/tmp/logfile-2.txt"

exec > >( tee "$log1" >"$log2" ) 2>&1

これは、プロセス置換を使用して、標準出力ストリームのteeを呼び出します。 teeユーティリティは入力を取得して$log1に保存し、そのコピーを$log2にリダイレクトします(teeは常に入力のコピーを生成します標準出力ですが、tee "$log1" "$log2" >/dev/null)を使用することもできます。次に、標準エラーストリームを標準出力と同じ場所にリダイレクトして、teeが同じ方法で複製できるようにします。

追加両方のログに、次を使用します

exec > >( tee -a "$log1" >>"$log2" ) 2>&1
2
Kusalananda