標準出力と標準エラーを2つのファイルに送信する方法

標準出力と標準エラーを2つのファイルに送信する方法

次の構文を使用して、stdoutとstderrを$ logファイルに送信します。

log=/var/tmp/install.log
info=/tmp/info.log 

exec > $log 2>&1

標準出力と標準エラーも/tmp/info.logファイルにリダイレクトするにはどうすればよいですか?

答え1

Bashを使用している場合は、プロセス置換を使用でき、次のことができますtee

exec &> >(tee "$log" > "$info")

これは、両方のストリームを交換プロセスにリダイレクトしてtee出力を"$log"stdinに送信し、出力を"$info".

/var/tmp/install.logそれ以外の場合は、コンテンツを次に送信するためにバックグラウンドプロセスを開始する必要があります/tmp/info.log

log=/var/tmp/install.log
info=/tmp/info.log 
exec > "$log" 2>&1
tail -n+1 -f "$log" > "$info" &

tailバックグラウンドで実行され、送信されたすべてのコンテンツをに/var/tmp/install.log送信します/tmp/info.log

答え2

タスクは、アプリケーションがログファイルを削除してもログ出力を保存することです。

を使用してログファイルの2番目の名前を生成すると、ログlnのデータを両方の名前で使用できます。いずれかの名前を削除しても、他の名前のデータは引き続き使用できます。

スクリプトから:

log=/var/tmp/install.log
info=/tmp/info.log 

ln -f "$log" "$info"

exec >"$log" 2>&1

以前に存在しなかった場合は、呼び出す前に作成する必要$logがあります。touch "$log"ln

これは、両方の名前が同じファイルシステムにあると仮定します。

この答えはあなたがbashsh

答え3

完全性のためにデフォルトのファイル記述子が出力されるので、1>を>として書き込むことができます。したがって、1>と>は同じです。

したがって、 command2>error1>output は command2>error>output になります。

関連情報