次の構文を使用して、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
これは、両方の名前が同じファイルシステムにあると仮定します。
この答えはあなたがbash
。sh
答え3
完全性のためにデフォルトのファイル記述子が出力されるので、1>を>として書き込むことができます。したがって、1>と>は同じです。
したがって、 command2>error1>output は command2>error>output になります。