Rubyからシェルコマンドを呼び出す方法

ruby shell interop


Rubyプログラムの内部からシェルコマンドを呼び出すには?これらのコマンドの出力を Ruby に戻すにはどうすればいいですか?




Answer 1 Steve Willard


この説明は、私の友人からのコメント付きのRubyスクリプトに基づいています。スクリプトを改善したい場合は、リンクから自由に更新してください。

まず、Rubyがシェルを呼び出すとき、通常はBash ではなく /bin/sh を呼び出すことに注意してください。一部のBash構文は、すべてのシステムの /bin/sh でサポートされていません。

シェルスクリプトを実行する方法を紹介します。

cmd = "echo 'hi'" # Sample string that can be used
  1. Kernel#` 、通称バック `cmd`

    これは、Bash、PHP、Perlなどの他の多くの言語と同じです。

    シェルコマンドの結果 (標準出力)を返します。

    ドキュメント:http : //ruby-doc.org/core/Kernel.html#method-i-60

    value = `echo 'hi'`
    value = `#{cmd}`
  2. 組み込み構文、 %x( cmd )

    x 文字の後には区切り文字があり、任意の文字にすることができます。区切り文字が文字 ([{ 、または < のいずれかである場合、リテラルは、ネストされた区切り文字のペアを考慮して、対応する終了区切り文字までの文字で構成されます。他のすべての区切り文字の場合、リテラルは、区切り文字の次の出現文字列補間 #{ ... } が許可されます

    シェルコマンドの結果 (すなわち標準出力)を、バックトークと同様に返します。

    ドキュメント:https : //docs.ruby-lang.org/en/master/syntax/literals_rdoc.html#label-Percent+Strings

    value = %x( echo 'hi' )
    value = %x[ #{cmd} ]
  3. Kernel#system

    サブシェルで指定されたコマンドを実行します。

    コマンドが見つかり、正常に実行された場合は true を返し、それ以外の場合は false を返します。

    ドキュメント:http : //ruby-doc.org/core/Kernel.html#method-i-system

    wasGood = system( "echo 'hi'" )
    wasGood = system( cmd )
  4. Kernel#exec

    与えられた外部コマンドを実行することで、現在のプロセスを置き換えます。

    none を返します。現在のプロセスは置換され、継続されません。

    ドキュメント:http : //ruby-doc.org/core/Kernel.html#method-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

詳細はこちらをご覧ください。




Answer 2 Ian


これは、「Rubyでサブプロセスを起動する各メソッドをいつ使用するか」に基づくフローチャートです。「アプリケーションをだまして、その標準出力がパイプではなく端末であると思わせる」も参照してください。

enter image description here




Answer 3 cynicalman


これを行うには、 %x リテラルを使用します。これにより、コマンドで引用符を簡単に(そして読みやすく)使用できます。

directorylist = %x[find . -name '*test.rb' | sort]

この場合、カレントディレクトリ以下のすべてのテストファイルがファイルリストに表示され、期待通りに処理できます。

directorylist.each do |filename|
  filename.chomp!
  # work with file
end



Answer 4 Mihai A


Rubyでのシェルスクリプトの実行に関する私の意見の中で最も優れた記事は、「Rubyでシェルコマンドを実行する6つの方法」です。

出力だけを取得したい場合は、バックティックを使用します。

STDOUTやSTDERRのようなより高度なものが必要だったので、Open4 gemを使いました。そこにはすべてのメソッドが説明されています。




Answer 5 anshul


私のお気に入りはOpen3です

  require "open3"

  Open3.popen3('nroff -man') { |stdin, stdout, stderr| ... }