web-dev-qa-db-ja.com

Rubyでサブプロセスを起動する各メソッドを使用する場合

1. _``_バッククォート

1. a)_%x{}_パーセントX <バックティックの代替構文

2. system()

3. fork()

4. open()

4.a. IO.popen() <はopen()と同じように動作します

4.b. open("|-")

  • パイプへのフォーク

4.c. IO.popen("-") <はopen("|-")と同じように動作します

5. Open3.popen3()

  • _require 'open3'_
  • stdlib Open

6. PTY.spawn()

7. Shell.transact()

より複雑な方法の1つについて、信頼できるバックティックをいつ見捨てるべきですか?

編集1。各メソッドの使用例を説明する彼の投稿に Avdi Grimm に感謝します: #1 (& 要点 ); #2 (& 要点 );

それらは答えるのに素晴らしいリソースです方法ですが、答えるために明示的に構成されていませんそれぞれを使用する必要がある場合または理由、したがってIMHOはそうではありませんこの質問への完全な答え。

61
Alec Wenzowski
  1. プログラムの出力を変数に簡単にキャプチャする場合は、バッククォートを使用します。これはブロックされるため、おそらくこれは短期間のプログラムにのみ使用する必要があります。

  2. systemは、次の2つの場合に便利です。

    a。長時間実行されているプログラムがあり、実行時に出力を出力したい(例:system("tar zxvf some_big_tarball.tar.gz")

    b。 systemは、execのようにシェル拡張をバイパスできます(system "echo *"system "echo", "*"の出力を比較してください)

    サブプロセスが終了するまで、システムはブロックします。

  3. forkには、いくつかの異なるユースケースもあります。

    a。いくつかのRubyコードを別のプロセスで実行したい(例:fork { .... }

    b。スクリプトの進行をブロックせずに子プロセス(または別のプログラム)を実行したいfork { exec "bash" }

    forkは、プログラムをデーモン化する場合の友達です。

  4. IO.popenは、プログラムの標準出力および標準入力と対話する必要がある場合に役立ちます。標準のエラーはキャプチャされないため、気になる場合は2>&1でリダイレクトする必要があることに注意してください。

  5. popen3は、標準エラー用の個別のファイル記述子を提供します(標準出力とは別にキャプチャする必要がある場合)

  6. PTY.spawnは、生成されたプログラムをターミナルから実行しているように動作させる場合に必要です。 systemgrep --color=auto pat fileでスポーンしたときのPTY.spawnの違いを確認してください

43
cam

この回答 に基づくフローチャートを次に示します。 scriptを使用して端末をエミュレートする も参照してください。

enter image description here

29
Ian
8
Michael Kohl