少し前にスクリプトを作成し、その周りにロギングを追加しましたが、ロギングのリダイレクトがどのように機能するかを忘れてしまいました:-(
その要点は次のとおりです。
_#!/bin/bash
LOGFILE=/some/path/mylogfile
(
# here go my commands which produce some stdout
# and, if something goes wrong, also some stderr
) 1>>${LOGFILE} 2> >( tee -a ${LOGFILE} >&2 )
_
スクリプトを実行すると、stdout
には何も出力されず、stderr
に送信されるものだけが出力されます。ログファイル_${LOGFILE}
_は、stdoutとstderrの両方をキャプチャします。
スクリプトを実行し、端末に出力がない場合、すべて問題ないことがわかります。出力がある場合は、問題が発生していることがわかっているので、ログファイルをチェックして問題を特定できます。
今私を困惑させるリダイレクトの部分は、次の構文です:2> >( some command )
誰かがそこで何が起こっているのか説明できますか?
>(...)
は プロセス置換 と呼ばれます。これにより、「外部」プログラムが「内部」プログラムにファイルのように書き込むことができます。
この場合、stderr
を_tee -a ${LOGFILE} >&2
_に書き込んでいます。これにより、LOGFILE
に追加され、すべてがstderr
にも書き込まれます。
リダイレクションオペレーターはプロセス置換のどちらの方向にも進むことができるので、この例のようにそれに書き込むか、または<(...)
を使用してそれから読み取ることができます。これは、たとえば、 while
ループをサブシェル自体で実行せずにループします。