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ラインでファイル名を変更します。

おすすめ記事