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


18

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

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

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

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

回答:


23

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

この場合、に書き込みstderrtee -a ${LOGFILE} >&2行われLOGFILE、その後にすべてが書き込まれstderrます。

リダイレクト演算子はプロセス置換のためにどちらの方向にも進むことができるため、この例のように書き込むことができます。または、サブシェルで実行せずにループを実行するのに<(...)便利な方法です。while自体。


5
わかった:-)実行するecho <(date)と、置換されたファイルの名前が表示されます:/dev/fd/63。を実行するcat <(date)と、日付、つまり置換されたファイルのコンテンツが表示されますFri Nov 18 14:11:09 NZDT 2016
NZD

@NZD、はい-しかし、それが通常のファイルだとは思わないでください-あなたが見るの/devはプロセス間のパイプの名前です。
トビーSpeight

stderrを(teeこの場合はに)パイプできないため、この手法が使用されていますか?
bli

@bliええ、stdoutはすでに他の場所にリダイレクトされているので、これはteestderrに最も簡単な方法であり、stdoutとは別にするように思えます。
エリックルヌーフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.