web-dev-qa-db-ja.com

サブシェルとプロセス置換の違い

Bashでは、現在の作業ディレクトリを変数に割り当てます。サブシェルを使用して、これを行うことができます。

var=$(pwd)

echo $var
/home/user.name

このようにプロセス置換を使用する場合:

var=<(pwd)

echo $var
/dev/fd/63

プロセス置換は、プログラムがSTDINを受け入れない場合に主に使用されることを理解しました。プロセス置換が正確に何を行うのか、なぜ/dev/fd/63varに割り当てるのかは不明です。

7
PejoPhylo

コマンド置換($(...))は、コマンドの出力に置き換えられますが、プロセス置換(<(...))はファイル名コマンドの出力を読み取ることができるファイル。どちらの場合も、コマンドはサブシェルで実行されます。

あなたの場合、<(pwd)pwdからの出力は/dev/fd/63にあります。このファイルは、使用コマンド置換の実行が完了するとすぐに存在しなくなります(例のechoが完了すると)。

プロセス置換によって返されるファイル名は、通常のファイルではなく、ファイル記述子または名前付きパイプの名前です。

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

プロセス置換の一般的な使用法は、joinコマンドのファイルを事前にソートすることです。

$ join <( sort file1 ) <( sort file2 )

または、ファイルから列を削除する場合(ここで、列2は、タブ区切りファイルからcutを2回使用し、pasteを使用して結果を結合することにより削除されます):

$ paste <( cut -f 1 file ) <( cut -f 3- file )

プロセス置換は、一時ファイルを明示的に使用しないようにするための構文上のショートカットです。


コマンド置換とプロセス置換の両方がサブシェルで実行されます。

$ echo $( t=1234; echo $t )
1234
$ echo $t
(no output)

ここで、echoは、コマンド置換から文字列引数として1234を取得します。

$ cat <( t=4321; echo $t )
4321
$ echo $t
(no output)

ここでは、catはファイルのファイル名(名前付きパイプ/ファイル記述子)を引数として取得します。ファイルにはデータ4321が含まれています。

7
Kusalananda