• ベストアンサー

プロセス展開・名前つきパイプ・プロセス置換 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言語ソースが読めるかどうか分かりませんが 残念ながら、勉強不足です。。。 まずは、お礼まで・・・ ありがとうございました。

関連するQ&A

  • sedでの改行置換

    sedを用いた処理で質問があります。 出力結果の改行を置換して一列として表示しようとしているのですが、どうもうまくいきません。 (perlは敢えて使いません) 例えば、以下のようなファイルがあるとして、 $ cat hoge.txt hoge boo bar この出力結果を加工して、「hoge boo bar」のように、 改行をスペースに置換して一行として表示したい場合は、どのようにすれば良いでしょうか? ちなみに、以下のような使い方だと、うまくいきませんでした。 $ cat hoge.txt | sed 's/\ > / /g' $ cat hoge.txt | sed 's/\n/ /' ■実行環境 OS : RedHat EL 1 sedのバージョン : sed-4.0.7-3 宜しくお願い致します。

  • bashのaliasに引数を渡すには?

    sshでログインしたubuntuサーバー上で時間のかかるシェルスクリプト(例えば hoge.sh) を実行した後、sshから抜けてもプロセスを走り続けさせるためにnohupを使っています。 nohup hoge.sh > out.log 2> err.log < /dev/null & これはタイプ量が多いし、時間のかかるシェルスクリプトはhoge.shだけではないので、実行したいシェルスクリプトの名前の部分を引数にした下記のようなエイリアスを作りたいのですが、bashのaliasには引数が渡せないとの事です。 alias run='nohup $1 > out.log 2> err.log < /dev/null &' "alias 引数"で検索すると「関数を使うと良い」というページがいくつか見つかりますが、関数ではsshから抜けると終了してしまいます。どうするのが良いでしょうか?

  • 置換コマンド

    freeBSD5.3を使用している初心者です。 あるディレクトリ以下の全ファイルに対し、一度に内容の文字を置換したいのですがうまくいきません。 例えば /hoge/aaa.txt /hoge/bbb.txt /hoge/ccc.txt と、/hoge以下に3ファイルがあり、このファイルにAAAという文字列があるなら、AAAをBBBにしたいと思っています。 sed s/AAA/BBB/g /hoge/* とすると、置換後の中身が表示はされますが、それに置きかわったファイルは/hoge/以下に保存されていません。(もとのAAAのまま) できたら、/hoge 以下の置換されたファイルを/hoge2以下に同じ名前で保存させたいと思っています。 どなたか是非アドバイスお願いいたします。

  • 各行末にサーバのホスト名を代入したいと考えています。

    各行末にサーバのホスト名を代入したいと考えています。 ただし数百台のサーバに置換しますので、 サーバ毎にホスト名を手動で変更しての置換はなしでお願いします。 環境: CentOS5.4 例) # cat aaa.txt aaaaaaaaaaaaaa bbbbbbbbbbbbbb cccccccccccccc => 代入後 # cat aaa.txt aaaaaaaaaaaaaa:hoge bbbbbbbbbbbbbb:hoge cccccccccccccc:hoge 私が作成したワンライナーは次の通りです 失敗) # for x in `hostname` ; do sed -e 's/$/:$x/g' aaa.txt ; done aaaaaaaaaaaaaa:$x bbbbbbbbbbbbbb:$x cccccccccccccc:$x どうにもわかりません。 よろしくお願いします。

  • 名前付きパイプを使い文字列をブロードキャスト

    名前付きパイプを利用して、文字列をブロードキャストしたいと考えています。 --- シェル1$ cat > fifo --- シェル2$ cat fifo --- シェル3$ cat fifo --- のような状態で、シェル 1 で hello と入力し、Enter キーを押下すると、シェル 2 およびシェル 3 に hello と表示させたいのですが、実際にはシェル 3 (後から fifo を開いたシェル)にしか印字されません。 シェル 1 にて入力を終了(EOF送信)すると、シェル 2 、シェル 3 ともにファイルがクローズされ、cat が終了しているので、EOF は両方ともにブロードキャストされているようにも見え、動きが不可解です。 Q1) 名前付きパイプ fifo は、その名のとおり、「早い者勝ち」でデータを取得した方にしかデータが流れないんでしょうか。 Q2) その場合、親子関係なくプロセス間で、複数のプロセスに対して同一の文字列をブロードキャスト方法は、どのようにすればスマートでしょうか。 一度、通常ファイルに出力を書き込み、全プロセスが文字列を取得した事を監視してキューを削除する、みたいな方法は可能だと思いますが、これよりも良い方法があればお教えください。

  • 1回のssh命令でサーバファイル内容を自ファイル内容で置換したい

    1回のsshコマンドでサーバーファイル内容の一部をローカルファイルの内容で置換する方法はありますか。 sshコマンドを2回使用すればできるのですが、2回連続で同パスワードを入力するスクリプトは格好悪いので、何とか1回のsshコマンドでこれを実現したいと思っています。 私が考えたコマンドは次の2行です。 ssh サーバー名 'cat >一時ファイル名' <ローカルファイル名 ssh サーバー名 'sed -e "s/置換文字列/`cat 一時ファイル名`/" サーバーファイル名 >一時ファイル名; cat 一時ファイル名 >サーバーファイル名; rm 一時ファイル名' 1行目のコマンドは、置換に使用するローカルファイルをサーバーへ複製しています。 2行目のコマンドは、複製したファイルを使用してサーバーファイルの内容を置換しています。置換後、用済みになった複製ファイルを削除しています。 ;を使用すれば2行目のコマンドのように1行のsshコマンド中に複数のコマンドを記述できるのですが、 1行目のコマンドと2行目のコマンドを合体させるとうまくいかないのです。 いろいろ工夫したのですが、今の私の力ではこれ以上単純化することができませんでした。 もっと単純化すれば1行に合体できる気がするのです。 どなたか、良い案がありましたら教えてください。

  • パイプを用いたプロセス間通信について

    VC++2005にて下記サイトを参考にパイプを用いたプロセス間通信を行うプログラムを作成しています。 猫でもわかるプログラミング (1)第242章 匿名パイプ(サーバー側) http://www.kumei.ne.jp/c_lang/sdk3/sdk_242.htm (2)第243章 匿名パイプ(クライアント側) http://www.kumei.ne.jp/c_lang/sdk3/sdk_243.htm サーバー側からWriteFileでデータを送信する際に、 char型配列に入ったバッファデータ「szBuf」を送信し、 クライアント側のReadFileで同じく「szBuf」で受信していますが、 構造体Data ================== typedef TypeData{ int a; int b; char c[10]; }Data; ================== のオブジェクトdataを送信するには、WriteFile及びReadFileの箇所は どのように実装すれば良いのでしょうか? MSDNにはWriteFileの引数の型はLPCVOIDとあるため、 可能だと思うのですが。。。 もし解決策をご存知の方おられましたら、ご教示お願い致します。

  • Javaで名前付きパイプ通信

    プラットフォームWindows 2003サーバー。 C++のexeプログラムとJavaプログラム。 名前付きパイプでのプロセス間通信をしたいと考えています。 C++側は問題ないと思いますが、Java側で対応できますか? java.ioパッケージ内にpipedWriter/pipedReaderクラスがあるようですが、名前指定等がないようです。 どうぞご教授ください。

  • プロセス間通信について

    こんばんは、皆さん。 自分の意識の中では、プロセス間通信とは「ソケット通信」の事を指していると 思っており、その上でC言語で作成する必要があって、それについての参考になるような サイトや本を検索しているのですが、これ!という決め手なものが見つかっていません。 またプロセス間通信には「パイプインタフェース」!?というのもあるようで、 ソケット通信とどう違うのか、ちょっと混乱してきております。 プロセス間通信について分かりやすいお勧め本を教えていただけませんか。 よろしくお願いします。

  • sshの公開鍵認証の基本的な仕組みについて

    ネットワークセキュリティの初心者です。教えてください。 sshの認証を使用して、サーバのファイルをクライアントにコピーしようとしています。 こちらで行った手順は以下のとおりです。(クラサバ共にSolaris) クライアントにて:  ・ssh-keygen -t rsa で秘密鍵(id_rsa)と公開鍵(id_rsa.pub)を作成。  ・scp id_rsa.pub hoge@192.168.10.10:/tmp でサーバに転送  (パスワードを入力すれば転送できた) サーバにて  ・cat /tmp/id_rsa.pub >> ~/.ssh/authorizedkeys で設定 上記にて、クライアントから scp testfile hoge@192.168.10.10:/tmpをしたところ、パスワード入力なしで無事転送することができました。 ここまではOKなのですが(前置き長くてすみません) この状態で、クライアントにて再度 ssh-keygenを実行してしまうと、またサーバのauthorizedkeysを設定しなおさなければならないのでしょうか? また、クライアントでのssh-keygen実行時に、id_rsa以外の名前で鍵を作成したときはどうなのでしょうか?(やはりサーバでの設定が必要?) そもそも鍵を作成する仕組みや鍵を管理している仕組みがわかっていれば簡単な問題かもしれませんが、どなたか教えてください。 こちらでは安易にテストする環境がないため、宜しくお願いします。