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