プロセス置換
概要
bashの機能
<(コマンド)、>(コマンド)→/dev/fd/Xに置き換えられる
プロセス置換はファイル名になる
置換によって得られた/dev/fd/Xは、生成されたパイプへのシンボリックリンクとなる
echo <(seq 4)の結果が/dev/fd/63みたいになることから確認できる
プロセス置換ではコマンドに標準入出力ではないファイル経路を渡せる
プロセス置換を使えるタイプのアプリケーションはファイル名を引数から受け取るタイプのアプリ
A < <( B )やA > >( B )のようにリダイレクションを併用することで標準入出力に対応させられる パイプでの制約
データ経路が直列のみ
標準入出力以外の手段がない
パイプに繋げやすいプログラムとは標準入出力をデータの経路に使うプログラム→フィルタのように使える
ファイル名を引数から受け取るプログラムはフィルタにしにくいので思想的には微妙なプログラムになる
https://gyazo.com/856176a5ad5806dcc2477af9e48b1fb9
動作
<(コマンド)
コマンドの結果の標準出力→パイプ(スペシャルファイル)→/dev/fd/X
>(コマンド)
/dev/fd/Y→パイプ(スペシャルファイル)→コマンドの標準入力
例
diff
diff <( hostname | tr a-z A-Z ) <( hostname | sed -e 's/.*/\U&/' )
diff -y -W 10 <(for i in {1,2,3,4}; do echo $i; done) <(for i in {1,2,4,5}; do echo $i; done)
tee >( cat -n > save.out )
標準入力の内容をリアルタイムでcommandで編集して別ファイルに保存して、そのまま標準出力に流す
exec > >(tee console.log)
画面の出力内容をログに残したい時
名前付きパイプの代替
code:bash
exec {fd}<> <(:) # or exec {fd}<> >(:)
echo -e "0123456789\nABDEFGHIJKLMNOPQRSTUVWXYZ" >&${fd}
read l <&${fd}
echo $l # -> 0123456789
read l <&${fd}
echo $l # -> ABDEFGHIJKLMNOPQRSTUVWXYZ
exec {fd}>&-
参照