Lから始まるLinux

2章45話
パッチ
2章46話 プロセス置換
もくじ
2章47話
グルーピング
プロセス置換
若木 みどり
お兄ちゃん! diff で比較する内容を 入力リダイレクトから 受け取りたいんだけど 入力リダイレクトは 同時に1つしか使えないんだ
若木 みどり
diff 「比較元」 「比較先」の両方を 入力リダイレクトから 受け取る方法って あるのかな?
若木 しげる
ちゃんとあるから 安心してね 今回は「プロセス置換 (process substitution)」 を学ぼう!
書き方
若木 しげる
プロセス置換は このように書くよ
コマンド1 <(コマンド2)
コマンド1 >(コマンド2)
若木 しげる
<>(...) の間にスペースを入れてはいけないよ注意してね
若木 しげる
これは コマンド1<(...)>(...) がある位置にコマンド2 の実行結果を内容に持つファイルが引数で指定されたような状態になるよ
若木 しげる
ファイルを入力で使うの場合は <(...)出力で使うの場合は >(...)となるんだ
若木 みどり(驚き)
ちょっと言っている意味が理解できないぞ?
若木 しげる
これは定義を理解するより実際に使って覚えた方がいいと思うよ
使い方
若木 しげる
それではプロセス置換を使いながら覚えよう!
若木 みどり
うん!お兄ちゃんよろしくね!
若木 しげる
内容が異なる二つのディレクトリを作ってそれらの ls の結果をdiff で比べてみるよ
若木 しげる
まずは二つのディレクトリdiff1diff2 を作るよ
mkdir ~/diff{1,2}
若木 みどり
ブレース展開を使っているんだね
若木 しげる
次は diff1 ディレクトリの中にファイルを作ってみよう
touch ~/diff1/{1,2,3,4}
若木 みどり
ブレース展開が大活躍だね!コマンドを実行したよ!
若木 しげる
今度は diff2 ディレクトリの中にファイルを作ってみよう
touch ~/diff2/{1,2,4,5}
若木 みどり
ディレクトリの内容がちょっとずつ違うようにファイルを作るんだね
若木 しげる
ここで ls-1 オプションを指定してdiff1 の内容を見てみよう1(イチ) なので気を付けてね
ls -1 ~/diff1
若木 みどり
-1どんなオプションなんだろうね?
1
2
3
4
若木 みどり
なるほど!各ファイルを1行ずつ表示してくれるオプションなんだ!
若木 しげる
そういうことだね同じようにdiff2 ディレクトリも表示されてみよう!
ls -1 ~/diff2
1
2
4
5
若木 みどり
ls の出力が少しだけ違うのならdiffそれぞれの出力を比較できそうだね!
若木 しげる
コマンドでは入力リダイレクトを1つしか使えないけどプロセス置換は複数使えるんだこれらの出力の差分を表示させてみよう!
diff <(ls -1 ~/diff1) <(ls -1 ~/diff2)
若木 みどり(笑顔)
なるほど!お兄ちゃんの言っていた意味が今なら理解できるよ!
若木 みどり
プロセス置換 <(...) の位置にコマンドの実行結果を内容に持つファイルが引数で指定されたような状態になってくれるんだね!
3d2
< 3
4a4
> 5
若木 みどり(笑顔)
うん!3 ファイルは diff1 にあって diff2 になくて5 ファイルは diff2 にあって diff1 にはないねちゃんと期待どおりの差分を出力してくれているよ!
まとめ
若木 みどり
今回は「プロセス置換」を学んだよコマンドの引数のある場所に別のコマンドの実行結果内容を当てはめたい場合に便利なんだ!
若木 みどり(笑顔)
一つのコマンド内で複数回使えるというのも便利で嬉しいね!
若木 しげる
たいていは入力や出力リダイレクトをそのまま書けば済む場合が多く使用頻度はあまり多くない記述だよ
若木 しげる
今回の diff ように複数のリダイレクトを同時に扱いたい場合やコマンドが引数の指定のみ受け付け標準入力を受け付けない場合などで使われるんだ