対象: OSコマンド(Linux)の実行RubyでLinux等、OSのコマンドを実行する場合、いくつかの方法がある。手軽なのはバッククォートかsystemメソッドを利用する方法だろう。 IO.popenIO.popenメソッドを利用するとIOオブジェクトが得られる。得られたIOオブジェクトでgetsメソッドを使用すれば、実行結果を1行ずつ処理することができる。コマンドはshell経由で実行されるのでワイルドカード等も使用できる。 IO.popen("ping localhost") do |io| while io.gets print $_ end end IO.popenメソッドを使うメリットは、pingやtail -fのように継続的に実行されるコマンドの実行結果も得られることである。 PING localhost.localdomain (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=64 time=0.022 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=2 ttl=64 time=0.023 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=3 ttl=64 time=0.022 ms ^C --- localhost.localdomain ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1999ms rtt min/avg/max/mdev = 0.022/0.022/0.023/0.004 ms また、popenメソッドで実行したコマンドのプロセスIDをpidメソッドで得られるので、継続的に実行されるコマンドはプロセスIDを指定してProcess.killメソッドを実行すれば終了させることができる。 io = IO.popen("ping localhost") sleep(3) Process.kill("INT", io.pid) print io.readlinesIO.#popen IO.#pid systemsystemメソッドは成功すると戻り値としてtrueを返す、終了ステータスは$?を参照することで得られる。コマンドの出力は標準出力等へ表示される。渡された引数に*等のメタ文字が含まれる場合、systemメソッドはshell経由でコマンドを実行する。
p system("pwd") p "exit status is #{$?}" /home/mobile/ruby true "exit status is 0" systemメソッドには同名で引数が異なるものも用意されている。 Kernel.#systemexecexecメソッドもOSのコマンド等を実行するのに利用できる。特徴的なのは、このメソッドが成功すると戻らないことである。 以下のコードでp "after exec"は実行されることはない(スクリプト自体はexecメソッドが成功すると終了する)。渡された引数に*等のメタ文字が含まれる場合、execメソッドはshell経由でコマンドを実行する。 exec("pwd") p "after exec" /home/mobile/ruby execメソッドには同名で引数が異なるものも用意されている。 Kernel.#execバッククォートOSのコマンド等を`ls`のように`(バッククォート)で括るだけで実行できる。コマンドはOS上で`コマンド`の形式で実行され、コマンドの出力は戻り値から文字列として得られる。コマンドの終了ステータスは$?を参照すると得られる。 r = `pwd` p r p $? "/home/mobile/ruby\n" #<Process::Status: pid=????,exited(0)>Kernel.#` (2010/02/24)
Copyright(C) 2004-2014 モバイル開発系(K) All rights reserved.
[Home]
|