お兄ちゃん!
diff
で比較する内容を
入力リダイレクトから
受け取りたいんだけど
入力リダイレクトは
同時に1つしか使えないんだ
diff
で
ちゃんとあるから
安心してね
今回は「プロセス置換
(process substitution)」
を学ぼう!
プロセス置換は
このように書くよ
コマンド1 <(コマンド2)
コマンド1 >(コマンド2)
<
や >
と (...)
の間にスペースを入れてはいけないよ注意してねこれは
コマンド1
の<(...)
や >(...)
がある位置にコマンド2
の実行結果を内容に持つファイルが引数で指定されたような状態になるよファイルを入力で使うの場合は
<(...)
出力で使うの場合は >(...)
となるんだちょっと言っている意味が理解できないぞ?
これは定義を理解するより実際に使って覚えた方がいいと思うよ
それではプロセス置換を使いながら覚えよう!
うん!お兄ちゃんよろしくね!
内容が異なる二つのディレクトリを作ってそれらの
ls
の結果をdiff
で比べてみるよまずは二つのディレクトリ
diff1
と diff2
を作るよ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
ように複数のリダイレクトを同時に扱いたい場合やコマンドが引数の指定のみ受け付け標準入力を受け付けない場合などで使われるんだ