Ruby プログラム内からシェル コマンドを呼び出すにはどうすればよいですか? これらのコマンドの出力を Ruby に戻すにはどうすればよいですか?
ベストアンサー1
この説明はコメントに基づいていますRubyスクリプト友人からのものです。スクリプトを改良したい場合は、リンクから自由に更新してください。
まず、Ruby がシェルを呼び出す場合、通常はBashではなく/bin/sh
を呼び出すことに注意してください。一部の Bash 構文は、すべてのシステムで がサポートしているわけではありません。/bin/sh
シェル スクリプトを実行する方法は次のとおりです。
cmd = "echo 'hi'" # Sample string that can be used
Kernel#`
一般的にバックティックと呼ばれる –`cmd`
これは、Bash、PHP、Perl など他の多くの言語と同様です。
シェル コマンドの結果 (つまり標準出力) を返します。
ドキュメント:http://ruby-doc.org/core/Kernel.html#method-i-60
value = `echo 'hi'` value = `#{cmd}`
組み込み構文、
%x( cmd )
文字の後に続くのは
x
区切り文字で、任意の文字を使用できます。区切り文字が(
、[
、{
、のいずれかの文字である場合<
、リテラルは、ネストされた区切り文字のペアを考慮して、対応する終了区切り文字までの文字で構成されます。その他のすべての区切り文字の場合、リテラルは、次の区切り文字の出現までの文字で構成されます。文字列の補間#{ ... }
が許可されます。バックティックと同様に、シェル コマンドの結果 (つまり標準出力) を返します。
ドキュメント:https://docs.ruby-lang.org/en/master/syntax/literals_rdoc.html#label-Percent+Strings
value = %x( echo 'hi' ) value = %x[ #{cmd} ]
Kernel#system
指定されたコマンドをサブシェルで実行します。
true
コマンドが見つかって正常に実行された場合は戻り値を返しますfalse
。それ以外の場合は戻り値を返します。ドキュメント:http://ruby-doc.org/core/Kernel.html#メソッド i システム
wasGood = system( "echo 'hi'" ) wasGood = system( cmd )
Kernel#exec
指定された外部コマンドを実行して現在のプロセスを置き換えます。
何も返しません。現在のプロセスは置き換えられ、続行されません。
ドキュメント:http://ruby-doc.org/core/Kernel.html#メソッド i-exec
exec( "echo 'hi'" ) exec( cmd ) # Note: this will never be reached because of the line above
追加のアドバイス:$?
は と同じですが、バッククォートまたは を$CHILD_STATUS
使用すると、最後にシステムで実行されたコマンドのステータスにアクセスします。その後、およびプロパティにアクセスできます。system()
%x{}
exitstatus
pid
$?.exitstatus
詳細については以下を参照してください。