Ruby、exec、system、%x() またはバックティックの違い 質問する

Ruby、exec、system、%x() またはバックティックの違い 質問する

次の Ruby メソッドの違いは何ですか?

execsystemおよび%x()またはバッククォート

これらは Ruby 経由でプログラム的にターミナルコマンドを実行するために使用されることは知っていますが、これを行うのに 3 つの異なる方法がある理由を知りたいです。

ベストアンサー1

システム

systemメソッドはシステム プログラムを呼び出します。このメソッドには、コマンドを文字列引数として指定する必要があります。例:

>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true

STDIN呼び出されたプログラムは、Ruby プログラムの現在の 、STDOUTおよびオブジェクトを使用しますSTDERR。実際の戻り値はtruefalseまたは のいずれかですnil。例では、日付は の IO オブジェクトを通じて出力されました。プロセスがゼロのステータスで終了した場合、プロセスがゼロ以外のステータスで終了した場合、および実行が失敗した場合は、STDINメソッドは を返します。truefalsenil

Ruby 2.6 以降では、渡すとまたは をexception: true返す代わりに例外が発生します。falsenil

>> system('invalid')
=> nil

>> system('invalid', exception: true)
Traceback (most recent call last):
...
Errno::ENOENT (No such file or directory - invalid)

もう一つの副作用は、グローバル変数$?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。 メソッドは、引数として文字列を取ることができます。この場合、文字列はシェル展開の対象になります。 複数の引数を使用する場合、最初の引数はプログラムの実行に使用され、次の引数は呼び出されるプログラムへの引数として提供されます。

開く3.popen3

必要な情報が標準入力や標準エラーに書き込まれる場合もあり、それらも制御する必要があります。Open3.popen3便利です:

require 'open3'

Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
   pid = thread.pid
   puts stdout.read.chomp
end

おすすめ記事