``
_バッククォート%x{}
_パーセントX <バックティックの代替構文system()
fork()
open()
IO.popen()
<はopen()
と同じように動作しますopen("|-")
IO.popen("-")
<はopen("|-")
と同じように動作しますOpen3.popen3()
require 'open3'
_PTY.spawn()
require 'pty'
_Shell.transact()
require 'Shell'
_編集1。各メソッドの使用例を説明する彼の投稿に Avdi Grimm に感謝します: #1 (& 要点 ); #2 (& 要点 ); # 。
それらは答えるのに素晴らしいリソースです方法ですが、答えるために明示的に構成されていませんそれぞれを使用する必要がある場合または理由、したがってIMHOはそうではありませんこの質問への完全な答え。
プログラムの出力を変数に簡単にキャプチャする場合は、バッククォートを使用します。これはブロックされるため、おそらくこれは短期間のプログラムにのみ使用する必要があります。
system
は、次の2つの場合に便利です。
a。長時間実行されているプログラムがあり、実行時に出力を出力したい(例:system("tar zxvf some_big_tarball.tar.gz")
)
b。 system
は、exec
のようにシェル拡張をバイパスできます(system "echo *"
とsystem "echo", "*"
の出力を比較してください)
サブプロセスが終了するまで、システムはブロックします。
fork
には、いくつかの異なるユースケースもあります。
a。いくつかのRubyコードを別のプロセスで実行したい(例:fork { .... }
b。スクリプトの進行をブロックせずに子プロセス(または別のプログラム)を実行したいfork { exec "bash" }
。
fork
は、プログラムをデーモン化する場合の友達です。
IO.popen
は、プログラムの標準出力および標準入力と対話する必要がある場合に役立ちます。標準のエラーはキャプチャされないため、気になる場合は2>&1
でリダイレクトする必要があることに注意してください。
popen3
は、標準エラー用の個別のファイル記述子を提供します(標準出力とは別にキャプチャする必要がある場合)
PTY.spawn
は、生成されたプログラムをターミナルから実行しているように動作させる場合に必要です。 system
とgrep --color=auto pat file
でスポーンしたときのPTY.spawn
の違いを確認してください
この回答 に基づくフローチャートを次に示します。 script
を使用して端末をエミュレートする も参照してください。