kikeda1104's blog

備忘録・技術に関することを書いています。(webエンジニア)

Rubyからシェルコマンドを実行する(Kernel.#system ..etc)

調べていたので、書いていきます。 

前提

外部コマンドの呼び出し

実装で利用したは、#system, #`を利用していて、コマンドを実行して返却値、ステータスは無視するケースと返却値を利用するケースで分けて使っています。

  • Kernel.#system

    引数を外部コマンドとして実行して、成功した時に真を返します。 子プロセスが終了ステータス 0 で終了すると成功とみなし true を返します。 それ以外の終了ステータスの場合は false を返します。 コマンドを実行できなかった場合は nil を返します。 終了ステータスは変数 $? で参照できます。 コマンドを実行することができなかった場合、多くのシェルはステータス 127 を返します。(したがって $? の数値は、0x7f00)、シェルを介 さない場合は Ruby の子プロセスがステータス 127 で終了します。 コマンドが実行できなかったのか、コマンドが失敗したのかは、普通 $? を参照することで判別可能です。

  • Kernel.#`

    command を外部コマンドとして実行し、その標準出力を文字列として 返します。このメソッドは command の形式で呼ばれます。

  • exec

    引数で指定されたコマンドを実行します。 プロセスの実行コードはそのコマンド(あるいは shell)になるので、 起動に成功した場合、このメソッドからは戻りません。

  • Kernel.#spawn

    引数を外部コマンドとして実行しますが、生成した 子プロセスの終了を待ち合わせません。生成した子プロセスのプロセスIDを返します。

サンプル

コードの切り抜きを載せます。このままだと動かないです。

gist.github.com

参考

docs.ruby-lang.org

docs.ruby-lang.org

docs.ruby-lang.org

docs.ruby-lang.org