(2024-05-21 初稿)
Bashには、プロセス置換という便利な機能があるが、ちょっと使い方やそのメリットがわかりにくかったので、そのメリットについていくつかの例を考えてみた。
今回の記事は、以下のサイトを参考にさせて頂いた。多謝。m(__)m
プロセス置換の説明として、下のリンクの「ファイルを記述する替わりに、その位置にプロセス(コマンド)を記述」がわかりやすいかと思う。
プロセス置換は大きく分けて、2つのメリットがあると思われる。
- 一時ファイルが不要となる
- パイプを利用しないので、サブシェルの罠にはまらない
一時ファイルが不要となる
処理をしてから比較する
普通にdiffコマンドで比較する場合には利用価値は無いが、何らかの処理をしてから比較する場合は一時ファイルが不要となるためメリットがある。
具体例として、以下の2つの例をあげる。
大文字に変換(trコマンド)してから比較する
diff <(cat a.txt | tr a-z A-Z) <(cat b.txt | tr a-z A-Z) grep SOMEWORD <(cat test.txt | tr a-z A-Z)
リモートのファイルと比較する
筆者が考えた最大のメリットは、ssh等でリモートファイルを扱う場合。
remote-pcには、sshでアクセスできるように設定する必要があるけど。
diff /etc/hosts <(ssh remote-pc cat /etc/hosts) grep someword <(ssh remote-pc cat test.txt)
パイプを使用しないので、サブシェルの罠にはまらない
ちょっと前に以下の記事に書いたが、パイプを利用しないのでサブシェルの罠にはまらずに済む。
前述の例は、パイプを使った場合以下のように書ける。
grep SOMEWORD <(cat test.txt | tr a-z A-Z) ⇓ cat test.txt | tr a-z A-Z | grep SOMEWORD
ただし、以下のようなスクリプトの場合、パイプを使うとGVarの値が変わらず、意図したものと違う動きとなってしまう。
#!/usr/bin/env bash # procces置換のテスト GVar="false" mygrep() { GVar="true" grep "$1" "$2" } cat test.txt | tr a-z A-Z | mygrep SOMEWORD - echo $GVar mygrep SOMEOWRD <(cat test.txt | tr a-z A-Z) echo $GVar
上記スクリプトの実行結果は、以下のとおり。
..... SOMEWORD ...... false ..... SOMEWORD ...... true
ということで、これからはプロセス置換を積極的に利用していこうと考えた。
実は、プロセス置換には出力系の >(コマンド)もあるが、パイプやリダイレクトで代用できるケースが大半になるため、筆者には利用場面が思いつかなかった。(^^ゞ
また、何か気がついたら追記する。