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
または、ファイルから列を削除します(ここではpaste
2回使用し、結果をリンクしてタブ区切りのファイルから列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
。