2008-09-09

Ruby で子プロセス

Ruby でコマンドを呼び出したい。子プロセスを作りたい。組み込み関数 system の使い方。

system(command)

コマンド一つで済む場合は簡単。

引数を取る場合は、コロンで区切る。

system(program, arg1, arg2,...)

ARG1 以降は省略可能。ARG1 以降を省略する場合は、一番最初の例と同じになる。

以下、落ち穂拾い

  • コマンドの終了ステータスが 0 ならば、true を返す
  • そうでなければ false を返す
  • 終了ステータスは $? で参照できる

サンプル

ファイルの中身を一行ずつコマンドに渡す場合は、こんなコードになるかな。

#!/usr/bin/env ruby

require 'fileutils.rb'

# Usege:
# foo.rb sample.txt /old/dir/

filename = ARGV[0]
old_dir = ARGV[1]

File::open(filename){|file|
  file.each {|path|
    path.chomp!
    old = old_dir + path
    new_dir = File.dirname(path) + "/"

    FileUtils.mkdir_p(new_dir) unless FileTest.exist?(new_dir)
    system("cp", old, new_dir)
  }
}

かなり適当だけど、旧ディレクトリーの中にあるファイルを新ディレクトリーにコピーするコマンド。旧ディレクトリーからコピーし忘れたファイルがあった時に使えるかな。

あとがき

system 関数には、コマンドの引数をカンマで区切って渡す。それなのに、(shell で渡すやうに) スペースで区切って渡そうとして、エラーが出た。

system("program #{arg1} #{arg2}");

一時間近くハマったので、自戒の意味を込めてエントリーにする。

最初のタイトルは「Ruby でシステム・コール」でした。はてブで、これはシステム・コールではないと教えてもらいました orz

No comments:

Post a Comment