対象:
CRuby
JRuby

OSコマンド(Linux)の実行

RubyでLinux等、OSのコマンドを実行する場合、いくつかの方法がある。手軽なのはバッククォートかsystemメソッドを利用する方法だろう。

  1. IO.popen
  2. system
  3. exec
  4. バッククォート

IO.popen

IO.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.readlines
IO.#popen
IO.#pid

system

systemメソッドは成功すると戻り値としてtrueを返す、終了ステータスは$?を参照することで得られる。コマンドの出力は標準出力等へ表示される。渡された引数に*等のメタ文字が含まれる場合、systemメソッドはshell経由でコマンドを実行する。

p system("pwd")
p "exit status is #{$?}"
/home/mobile/ruby
true
"exit status is 0"

systemメソッドには同名で引数が異なるものも用意されている。

Kernel.#system

exec

execメソッドも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)

新着情報
【オープンソースソフトウェア環境構築】Apple silicon Macで開発環境を構築
【Rust Tips】Actix webでJSONをPOSTする
【Rust Tips】コマンドライン引数を取得する

Copyright(C) 2004-2014 モバイル開発系(K) All rights reserved.
[Home]