• ベストアンサー

プロセス展開・名前つきパイプ・プロセス置換 bash

質問です。 現在、いまいち仕組みが分かってないまま、 vimdiff hoge.txt <(ssh サーバ名 "cat hoge.txt") とかやって、別サーバとの差分を見たりしてます。 プロセス展開・名前つきパイプ・プロセス置換 など、いろいろな、言い方があるみたいですが、 これの仕組みについて、詳しく知りたいのです。 本とか読んでみたものの、いまいちしっくり来ません。 もし、参考になるページとかあれば是非・・・

質問者が選んだベストアンサー

  • ベストアンサー
  • Lean
  • ベストアンサー率72% (435/603)
回答No.1

>vimdiff hoge.txt <(ssh サーバ名 "cat hoge.txt") まず、プロセス置換<(...)の中の部分である「ssh サーバ名 "cat hoge.txt"」が名前付きパイプ(FIFO)か/dev/fd/0(ファイルディスクリプタ:標準入力)どちらかのファイルに置き換えられた感じになります。 つまり、 vimdiff hoge.txt 名前付きパイプ(FIFO) か vimdiff hoge.txt /dev/fd/0 のような感じです。 vimdiffからすれば「名前付きPIPE(FIFO)」か「/dev/fd/0」から通常のファイルと同じように読み込みを行います。 また「ssh サーバ名 "cat hoge.txt"」は(おそらく別プロセスで)実行され、その出力が上記の「名前付きPIPE(FIFO)」か「/dev/fd/0」に書き込まれます。 つまり、「名前付きPIPE(FIFO)」や「/dev/fd/0」から読める内容は、「ssh サーバ名 "cat hoge.txt"」を実行して出力された内容という事になります。 C言語ソースが読めるかどうか分かりませんが、実際にどのよう実現しているのかは、bashのソースを参照すれば分かると思います。

_memento
質問者

お礼

>/dev/fd/0(ファイルディスクリプタ:標準入力)どちらかのファイルに置き換えられた感じになります。 ありがとうございます。 ためしに、 ls <(ls -1) とかやったら、 /dev/fd/???? と返ってきました。 /dev/fd/???? というファイルに結果が置き換えられたという風に理解しました。 どのようにすれば、これを、効果的に使えるかは、 これから考えてみたいと思います。 2つのコマンドの出力を比較を diff <(????) <(????) などとやっている、例を見つけました。 なるほどという感じです。 >C言語ソースが読めるかどうか分かりませんが 残念ながら、勉強不足です。。。 まずは、お礼まで・・・ ありがとうございました。