1. ホーム
  2. ruby

[解決済み] Rubyからシェルコマンドを呼び出す方法

2022-03-19 04:24:51

質問

Rubyのプログラムの中からシェルコマンドを呼び出すにはどうしたらいいですか?また、これらのコマンドの出力を Ruby に戻すにはどうしたらよいでしょうか。

どのように解決するのですか?

この説明は、コメント付きの ルビースクリプト 私の友人からの情報です。もし、このスクリプトを改良したい場合は、リンク先で自由に更新してください。

まず、Rubyがシェルを呼び出す場合、通常は /bin/sh , ではなく Bash Bashの構文にはサポートされていないものがあります /bin/sh を、すべてのシステムで使用できます。

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

cmd = "echo 'hi'" # Sample string that can be used

  1. Kernel#` 一般にバックティックと呼ばれる `cmd`

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

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

    Docs http://ruby-doc.org/core/Kernel.html#method-i-60

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

    に続いて x 文字はデリミタであり、任意の文字が使用可能である。 デリミタには任意の文字を指定できます。 ( , [ , { または < , の場合、リテラルはマッチするクロージングデリミタまでの文字で構成されます。 ネストされた区切り文字のペアを考慮する。それ以外の区切り文字に対しては リテラルは、その文字が次に現れるまでの文字から構成されます。 デリミタ文字 文字列の補間 #{ ... } が許される。

    バックティックと同じように、シェルコマンドの結果(つまり標準出力)を返します。

    Docs 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 それ以外の場合は

    Docs http://ruby-doc.org/core/Kernel.html#method-i-system

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

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

    現在のプロセスを置き換えた後、決して継続しない。

    Docs 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{} . その後 exitstatuspid プロパティを使用します。

$?.exitstatus

もっと読みたい方はこちらをご覧ください。