stdoutとstderrをログファイルに書きたいシェルスクリプトがあります。stderrとstdoutを1つのファイルに書き出すだけでなく、stderrを別のファイルに書き込む
sh script.sh >> both.log 2>&1
しかし、私もstderrを別のファイル "error.log"に同時に書きたいと思っています。これは達成可能ですか?
stdoutとstderrをログファイルに書きたいシェルスクリプトがあります。stderrとstdoutを1つのファイルに書き出すだけでなく、stderrを別のファイルに書き込む
sh script.sh >> both.log 2>&1
しかし、私もstderrを別のファイル "error.log"に同時に書きたいと思っています。これは達成可能ですか?
追加のファイルディスクリプタを必要と第一のスイッチstdoutとstderr、する必要があります。
sh script.sh 3>&2 2>&1 1>&3 3>&-
最後のオペレータが補助ファイルディスクリプタをクローズします。
あなたは(標準入力されるようになりました)エラーストリームを複製して、エラーログに付加するtee
を使用することができます後:
sh script.sh 3>&2 2>&1 1>&3 3>&- | tee -a error.log
その後あなたがあなたにstdinとstderrの両方を指示することができます複合ログ:
(sh script.sh 3>&2 2>&1 1>&3 3>&- | tee -a error.log) >> both.log 2>&1
コマンド全体のエラーストリームをキャプチャするには、コマンドの前後のかっこが重要です。それらがなければ、tee
コマンドの(空の)エラーストリームだけがキャプチャされ、残りは依然としてターミナルに送られます。
注:これは、ファイル記述子3が使用中(開かれている)前にチェックしません。
sh script.sh {tmpfd}>&2 2>&1 1>&${tmpfd}-
tee
を使用すると、2つの場所に出力を複製できます。いくつかのトリッキーなリダイレクション、および...
script.sh 2>&1 >> both.log | tee -a both.log >> error.log
でこれはstdoutに標準エラー出力をリダイレクトし、その後、both.log
に標準出力することを結合します。 stderrは残り、tee
にパイプされ、両方のログファイルにコピーされます。このため
これがどのように保持されているか分かりません'error.log'ファイル内のstd-err msgsだけです。その後、2>&1'と混同されません(区別できません)。 ? – shellter
注文が「>> both.log 2>&1'」に変更された場合、それらは一緒に混合されます。リダイレクションは直観に反します。 '2>&1'は" stderrがstdoutに行く "という意味ではありません。それは、 "stderrがどこに行くかはどこにでも行く"という意味です。変数の割り当てのように考えてください。 'x = 5; y = x; x = 7; '' y 'の値は7ではなく5です。 –
ああ、duh ... '2>&1'の位置が標準的な練習と入れ替えられました。どのような素晴らしいトリック!応答のためのTnx。 – shellter
の可能性のある重複した[?バッシュの同じ行の別のファイルに標準エラー出力と標準出力をリダイレクトする方法](HTTP:bashのでは、以前に使用されていないファイルディスクリプタを選択し、最後のリダイレクトでそれを閉じるためにこれを使用することができます://stackoverflow.com/questions/7901517/how-to-redirect-stderr-and-stdout-to-different-files-in-the-same-line-of-bash) –