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

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

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

var=$(pwd)

echo $var
/home/user.name

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

var=<(pwd)

echo $var
/dev/fd/63

私が知っている限り、プロセス置換はプログラムがSTDINを許可しないときに主に使用されます。プロセスの交換が正確に何をするのか、なぜ/dev/fd/63割り当てられるのかは不明ですvar

答え1

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

pwdあなたの場合、in出力は<(pwd)にあるかもしれません/dev/fd/63。コマンドが実行されると、ファイルは存在しなくなります。使用varプロセス交換の実行が完了しました(例の割り当てが完了したら)。

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

/dev/fdプロセス置換は、名前付きパイプ(FIFO)または名前付きファイルを開く方法をサポートするシステムでサポートされています。

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

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

cutまたは、ファイルから列を削除します(ここではpaste2回使用し、結果をリンクしてタブ区切りのファイルから列2を削除します)。

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

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


コマンド置換とプロセス置換は両方ともサブシェルで行われます。以下に示すように、これらのサブシェルの環境は親シェルの環境に影響を与えません。

$ unset t
$ echo "$( t=1234; echo "$t" )"
1234
$ echo "$t"
(empty line output)

ここでは、コマンド置換から文字列パラメータをecho取得します。1234

$ unset t
$ cat <( t=4321; echo "$t" )
4321
$ echo "$t"
(empty line output)

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

関連情報