標準出力と標準エラーをログにコピーするには?

標準出力と標準エラーをログにコピーするには?

stderrとstdoutに書き込む$LOGと同時に、スクリプトからコンソールに印刷する必要があります。

スクリプトには多くのコマンドがあるため、各コマンドをリダイレクトするのは良い解決策ではありません。

これを試しましたが、期待どおりに動作しません。

#!/bin/bash

LOG=/var/tmp/log

#...

exec > $LOG  2>&1

私の目標は、stdoutとstderrに書く$LOGだけでなく、(コンソールから)stdoutに書くことです。可能ですか?

答え1

使用ティー。たとえば、

command 2>&1 | tee file.txt

commandSDTERRをSDTOUTにリダイレクトして機能します。teeSTDINをSTDOUTとファイルにコピーしますfile.txt

Bashでは、次のものを使用できます。プロセスの交換出力を次の場所にコピーします$LOG

exec &> >(tee $LOG)

しかし、これはバシズム 動作しません別の殻に。

答え2

これが最もクリーンなソリューションであるかどうかはわかりませんが、私にとっては効果的でした。

#!/bin/bash

LOG=/var/tmp/log

(
# lots of commands
# ...

) 2>&1 | tee $LOG

しかし、@sebasthはより良いソリューションを提供しました。

#!/bin/bash

LOG=/var/tmp/log

exec &> >(tee $LOG)

#...

関連情報