Bashの「<(cmd)」モードはどのように機能しますか? [コピー]

Bashの「<(cmd)」モードはどのように機能しますか? [コピー]

Bashで私が使用するパラメータは次のとおりです。

paste <(cat file1 | sort) <(cat file2 | sort)

または

comm <(cat file1 | sort) <(cat file2 | sort)

man commまたは を確認すると、man pasteマニュアルにパラメータが実際にファイルであることが示されます。

質問:

  1. <(cat file1 | sort)との中間一時ファイルが作成されますか(TEMPファイルシステムまたは遅いディスク上の他の場所)<(cat file2 | sort)

  2. この魔法の名前は何ですか<( )? (文書を探す)

  3. bashに固有のものですか、それとも他のシェルでも機能しますか?

答え1

これをプロセス交換といいます。

3.5.6 プロセスの交換

プロセス置換を使用すると、ファイル名を使用してプロセスの入力または出力を参照できます。

プロセスのリストは非同期で実行され、対応する入力または出力はファイル名で表示されます。ファイル名は拡張の結果として現在のコマンドに引数として渡されます。 >(リスト)形式を使用している場合は、ファイルに書き込むとリストへの入力が提供されます。 <(リスト)形式を使用している場合は、リストの出力を取得するには引数として渡されたファイルを読み取る必要があります。 <または>と開いている角かっこの間にはスペースを入れないでください。それ以外の場合、構文はリダイレクトとして解釈されます。プロセス置換は、名前付きパイプ(FIFO)または/ dev / fd名前付きファイルを開く方法をサポートするシステムでサポートされています。

もともとkshに登場したので、単純なbashではありませんが、posix標準にはありません。

内部的には、プロセスの交換は2つの方法で実装されます。これをサポートするシステム/dev/fd(ほとんどのUnixファミリーシステム)は、pipe(新しい匿名パイプのファイル記述子を返すシステム呼び出しを呼び出し、文字列を生成してコマンドライン$fd/dev/fd/$fdそれを置き換える方法で機能します。サポートされていないシステムでは、名前付きパイプを新しい一時ファイル名にし、/dev/fdコマンドmkfifoラインでファイル名を変更します。

答え2

<( somecommand )出力を含む一時ファイルのファイル名と考えることができますsomecommand。つまり、

utility < <( somecommand )

近道だ

somecommand >tempfile
utility <tempfile
rm -f tempfile

そして

utility <( somecommand )

近道だ

somecommand >tempfile
utility tempfile  # notice the lack of redirection here (utility expected to read from "tempfile")
rm -f tempfile

>( somecommand )標準入力に提供される一時somecommandファイルのファイル名と考えることもできます。つまり、

utility > >( somecommand )

近道だ

utility >tempfile
somecommand <tempfile
rm -f tempfile

そして

utility >( somecommand )

おそらく近道

mkfifo temppipe
somecommand <temppipe &
utility temppipe  # utility is expected to write to "temppipe"
rm -f temppipe

(あるいは同様のもの)

関連情報