web-dev-qa-db-ja.com

Bashでの '2>>(command)'リダイレクトの意味

少し前にスクリプトを作成し、その周りにロギングを追加しましたが、ロギングのリダイレクトがどのように機能するかを忘れてしまいました:-(

その要点は次のとおりです。

_#!/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 )

誰かがそこで何が起こっているのか説明できますか?

19
NZD

>(...)プロセス置換 と呼ばれます。これにより、「外部」プログラムが「内部」プログラムにファイルのように書き込むことができます。

この場合、stderrを_tee -a ${LOGFILE} >&2_に書き込んでいます。これにより、LOGFILEに追加され、すべてがstderrにも書き込まれます。

リダイレクションオペレーターはプロセス置換のどちらの方向にも進むことができるので、この例のようにそれに書き込むか、または<(...)を使用してそれから読み取ることができます。これは、たとえば、 whileループをサブシェル自体で実行せずにループします。

25
Eric Renouf