コンピュータ科学において、プロセス置換とはプロセス間通信の一形態であり、コマンドの入出力をファイルとして扱うことを可能にします。コマンドは、通常ファイル名が記述される箇所で、コマンドシェルによってインライン置換されます。これにより、通常はファイルのみを受け入れるプログラムが、他のプログラムから直接読み書きできるようになります。
プロセス置換は、ベル研究所のKornShellksh88の1988年版であるでは、コンパイル時オプションとして利用可能でした。[1] rcシェルは、1990年にリリースされたバージョン10 Unixで「パイプライン分岐」としてこの機能を提供しています。[ 2] Bashシェルは、1994年にリリースされたバージョン1.14以降でプロセス置換を提供しました。[3]
次の例では、KornShell 構文を使用しています。
Unixの diffコマンドは通常、比較する2つのファイル名、または1つのファイル名と標準入力を受け入れます。プロセス置換を使用すると、2つのプログラムの出力を直接比較できます。
$ diff < ( ファイル1をソート) < ( ファイル2をソート)
この<(command)式は、コマンドインタープリタにコマンドを実行し、その出力をファイルとして出力するよう指示します。コマンドは、任意の複雑なシェルコマンドにすることができます。
プロセス置換がない場合、代替手段は次のようになります。
$ sort file2 > /tmp/file2.sorted
$ sort file1 | diff - /tmp/file2.sorted
$ rm /tmp/file2.sorted
$ mkfifo /tmp/sort2.fifo
$ sort file2 > /tmp/sort2.fifo & $ sort file1 | diff - /tmp/sort2.fifo
$ rm /tmp/sort2.fifo
どちらの選択肢も、より面倒です。
プロセス置換は、通常はファイルに出力される出力をキャプチャし、プロセスの入力にリダイレクトするためにも使用できます。プロセスへの書き込みを行うBashの構文は です。以下は、 、、コマンドを使用して、 でファイル内の行数をカウントし、 でファイルを1回のパスで圧縮する>(command)例です。
teewcgzipwc -lgzip
$ tee > ( wc -l > & 2 ) < ビッグファイル| gzip >ビッグファイル.gz
プロセス置換が他の方法に比べて優れている主な利点は次のとおりです。
プロセス置換は内部的には2つの実装で実行されます。プロセス置換をサポートするシステム/dev/fd(ほとんどのUnix系システム)では、システムコールを呼び出して新しい匿名パイプのpipe()ファイル記述子を取得し、文字列 を作成してコマンドラインで置換します。プロセス置換をサポートしないシステムでは、新しい一時ファイル名を指定して を呼び出して名前付きパイプを作成し、コマンドラインでそのファイル名を置換します。この手順を説明するために、プロセス置換をサポートするシステムにおける以下の単純なコマンド置換を考えてみましょう。
$fd/dev/fd/$fd/dev/fdmkfifo/dev/fd
$ diff ファイル1 < (ソート ファイル2 )
シェルが実行する手順は次のとおりです。
/dev/fd/63、 のようなコマンドで確認できますecho <(true)。sort file2この場合は )、その出力を匿名パイプにパイプします。diff file1 /dev/fd/63。名前付きパイプの場合、実行はパイプの作成と削除のみで異なります。パイプはmkfifo(新しい一時ファイル名が付与されます)で作成され、 で削除されますunlink。その他の点は同じです。
作成された「ファイル」はシーク不可能であるため、ファイルを読み書きするプロセスはランダムアクセスを実行できず、最初から最後まで1回だけ読み書きする必要があります。ファイルを開く前に明示的にファイルの種類を確認するプログラムは、プロセス置換によって生成された「ファイル」が通常のファイルではないため、プロセス置換を処理できない場合があります。さらに、Bash 4.4(2016年9月リリース)までは、プロセス置換を作成したシェルからプロセス置換コマンドの終了コードを取得することはできませんでした。[4]