一から勉強させてください

最下級エンジニアが日々の学びをアウトプットしていくだけのブログです

プロセス置換 (Process Substitution)について

bashzsh にはプロセス置換 (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 のドキュメントでも bashzsh の自動補完の項で echo 'source <(kubectl completion bash)' >>~/.bash_profileのようにプロセス置換を使っていたり。

まとめ

ファイルしか受け付けないようなコマンドでもプロセス置換を使えば一時ファイルを作成する必要がないので便利。>(list)の方は使い道あまり思いつかなかった w

参照