Ruby 2.3.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Kernelモジュール > exec
exec(command, options={}) -> ()
[permalink][rdoc]exec(env, command, options={}) -> ()
引数で指定されたコマンドを実行します。
プロセスの実行コードはそのコマンド(あるいは shell)になるので、 起動に成功した場合、このメソッドからは戻りません。
この形式では command が shell のメタ文字
* ? {} [] <> () ~ & | \ $ ; ' ` " \n
を含む場合、shell 経由で実行されます。 そうでなければインタプリタから直接実行されます。
# a.rb puts '実行前' exec 'echo "実行中"' puts '実行後'
上記のスクリプトを実行すると以下のようになります。
$ ruby a.rb 実行前 実行中 # '実行後' は表示されない
exec(program, *args, options={}) -> ()
[permalink][rdoc]exec(env, program, *args, options={}) -> ()
引数で指定されたコマンドを実行します。
プロセスの実行コードはそのコマンド(あるいは shell)になるので、 起動に成功した場合、このメソッドからは戻りません。
この形式では、常に shell を経由せずに実行されます。
exec(3) でコマンドを実行すると、 元々のプログラムの環境をある程度(ファイルデスクリプタなど)引き継ぎます。 Hash を options として渡すことで、この挙動を変更できます。 詳しくは Kernel.#spawn を参照してください。
この形式で呼び出した場合、空白や shell のメタキャラクタも そのまま program の引数に渡されます。 先頭の引数が2要素の配列であった場合、第1要素の文字列が実際に 起動するプログラムのパスであり、第2要素が「みせかけ」のプロ グラム名になります。 また、第1要素はフルパスで指定しなくても環境変数 PATH から探します。
例
# a.rb exec ['sleep', 'mysleep'], '600'
上記スクリプトを実行すると以下のようになります。
$ ruby a.rb ## sleep してるので制御が戻ってこない。別の仮想端末に切替えて以下を実行 $ ps aux|grep sleep xxxx 32754 0.0 0.0 2580 468 pts/3 S+ 22:01 0:00 mysleep 600 xxxx 32761 0.0 0.0 2824 792 pts/6 S+ 22:01 0:00 grep sleep
[SEE_ALSO] Kernel.#system,Kernel.#`,Kernel.#spawn,Kernel.#fork,IO.popen,IO.pipe,Kernel.#open,exec(3)