次のRubyメソッドの違いは何ですか?
exec
、system
および%x()
またはバッククォート
Rubyを介してプログラムで端末コマンドを実行するために使用されることは知っていますが、これを行うには3つの異なる方法がある理由を知りたいのです。
次のRubyメソッドの違いは何ですか?
exec
、system
および%x()
またはバッククォート
Rubyを介してプログラムで端末コマンドを実行するために使用されることは知っていますが、これを行うには3つの異なる方法がある理由を知りたいのです。
回答:
システム
このsystem
メソッドはシステムプログラムを呼び出します。このメソッドの文字列引数としてコマンドを提供する必要があります。例えば:
>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true
呼び出されたプログラムは、現在使用されますSTDIN
、STDOUT
そしてSTDERR
、あなたのRubyプログラムのオブジェクトを。実際、実際の戻り値はtrue
、false
またはのいずれかnil
です。この例では、日付はのIOオブジェクトを通じて出力されましたSTDIN
。true
プロセスがゼロのステータスで終了した場合、プロセスがゼロ以外のステータスでfalse
終了したnil
場合、および実行が失敗した場合、メソッドは戻ります。
別の副作用は、グローバル変数$?
がProcess::Status
オブジェクトに設定されることです。このオブジェクトには、呼び出されたプロセスのプロセス識別子(PID)や終了ステータスなど、呼び出し自体に関する情報が含まれます。
>> system("date")
Wed Sep 4 22:11:02 CEST 2013
=> true
>> $?
=> #<Process::Status: pid 15470 exit 0>
バックティック
バックティック( ``)はシステムプログラムを呼び出し、その出力を返します。最初のアプローチとは異なり、コマンドは文字列ではなく、バッククォートペア内に配置することで提供されます。
>> `date`
=> Wed Sep 4 22:22:51 CEST 2013
グローバル変数$?
もバッククォートを介して設定されます。バックティックを使用すると、文字列補間を使用することもできます。
%バツ()
を使用%x
すると、バックティックスタイルの代わりになります。出力も返します。親戚%w
や%q
(他の)と同様に、ブラケット形式の区切り文字が一致する限り、どの区切り文字でも十分です。これは手段%x(date)
、%x{date}
および%x-date-
すべての同義語です。同様に、バックティック%x
は文字列補間を利用できます。
エグゼクティブ
Kernel#exec
現在のプロセス(Rubyスクリプト)を使用すると、から呼び出されたプロセスに置き換えられますexec
。このメソッドは文字列を引数として取ることができます。この場合、文字列はシェル展開の対象になります。複数の引数を使用する場合、最初の引数を使用してプログラムを実行し、呼び出されるプログラムの引数として以下を指定します。
Open3.popen3
必要な情報が標準入力または標準エラーに書き込まれることがあり、それらも制御する必要がある場合があります。ここOpen3.popen3
で便利です:
require 'open3'
Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
pid = thread.pid
puts stdout.read.chomp
end
STDIN
、STDOUT
、STDERR
、検討するOpen3.popen3
代わりに、例:stackoverflow.com/a/10922097/258662を
この回答に基づくフローチャートを次に示します。端末のエミュレートに使用script
するもご覧ください。
彼らは異なることをします。 exec
現在のプロセスを新しいプロセスで置き換え、決して戻りません。 system
別のプロセスを呼び出し、その終了値を現在のプロセスに返します。バックティックを使用すると、別のプロセスが呼び出され、そのプロセスの出力が現在のプロセスに返されます。