📘
プロセス置換 (Process Substitution)について
bash や zsh にはプロセス置換 (Process Substitution)という機能があるのだが、あまり使うことがなく、毎回忘れるのでメモ。
プロセス置換 (Process Substitution)とは
コマンドの結果をファイルのように扱うことができる機能。以下のように書く。
-
<(list)
- リストの結果を入力ファイルに置き換える
-
>(list)
- リストの結果を出力ファイルに置き換える
これはリストの結果をもう一方のプロセスに送るために/dev/fd/<n>
のファイルディスクリプタを使っているっぽい。
使用例
例えば comm
というコマンドがある。これは comm file1.txt file2.txt
のようにしてファイル 1 と 2 を良い感じに比較したりできるが、プロセス置換を使えばファイルを用意せず使用することができる。
$ comm <(ls -l) <(ls -la)
total 0
-rw-r--r--@ 1 username staff 0 Jun 6 17:29 file1.txt
drwxr-xr-x 3 username staff 96 May 18 2019 tmp
total 16
drwx------+ 6 username staff 192 Jun 6 17:29 .
drwxr-xr-x+ 132 username staff 4224 Jun 6 16:25 ..
-rw-r--r--@ 1 username staff 0 Jun 6 17:29 .secret.txt
-rw-r--r--@ 1 username staff 0 Jun 6 17:29 file1.txt
drwxr-xr-x 3 username staff 96 May 18 2019 tmp
またディレクトリ間の差分を見たい場合など、diff
コマンドをよく使うがこれも以下のようにプロセス置換を使うことができてよい。
$ diff <(ls $first_directory) <(ls $second_directory)
他にも例えば、k8s のドキュメントでも bash や zsh の自動補完の項で echo 'source <(kubectl completion bash)' >>~/.bash_profile
のようにプロセス置換を使っていたり。
まとめ
ファイルしか受け付けないようなコマンドでもプロセス置換を使えば一時ファイルを作成する必要がないので便利。>(list)
の方は使い道あまり思いつかなかった。
Discussion