bashの '<(file contents)'構文とは何ですか?


25

セキュリティStackExchangeに関するこの回答では、興味深いbash構文を使用してインラインでファイルを生成しています。

openssl req -new -x509 -nodes -newkey ec:<(openssl ecparam -name secp384r1) -keyout cert.key -out cert.crt -days 3650

このビットは特に興味深いものです。

<(openssl ecparam -name secp384r1)

ちょうど実行:

echo <(openssl ecparam -name secp384r1)

私は戻ってきます /dev/fd/63

そのため、これはファイルの内容で一時ファイル記述子を作成するようです。

これは何と呼ばれていますか?


3
結果の「ファイル」は実際には名前付きパイプであり、一部のプログラムではファイル引数としてサポートされていないことに注意してください。例:でgit diff --no-index file1 <(cat file2)失敗します:error: /dev/fd/63: unsupported file type。またerror: readlink("/dev/fd/63"): No such file or directory、実装がパイプへのシンボリックリンクを作成するかどうかも確認できます(何らかの理由で壊れたリンクとして表示されます)。
ケルビン

回答:


35

これはプロセス置換と呼ばれ、bash、zsh、およびkshの機能です(おそらく他の人も知りません)。POSIXではないため、移植可能なコードで使用するべきではありませんが、非常に便利です。

bashマニュアルの関連セクションは次のとおりです。

3.5.6プロセスの置換

プロセス置換は、名前付きパイプ(FIFO)または開いているファイルに名前を付ける/ dev / fdメソッドをサポートするシステムでサポートされています。の形をとる

  <(list) 

または

  >(list) 

プロセスリストは、入力または出力がFIFOまたは/ dev / fd内のファイルに接続されて実行されます。このファイルの名前は、展開の結果として現在のコマンドに引数として渡されます。>(list)フォームが使用されている場合、ファイルへの書き込みはリストへの入力を提供します。<(list)形式を使用する場合、引数として渡されたファイルを読み取ってlistの出力を取得する必要があります。<または>と左括弧の間にスペースを入れてはならないことに注意してください。そうしないと、構造はリダイレクトとして解釈されます。

使用可能な場合、プロセス置換は、パラメーターおよび変数の展開、コマンドの置換、および算術展開と同時に実行されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.