Rubyでshellコマンドの実行を呼び出す6つの方法

2635 ワード

オペレーティングシステムshellコマンドを呼び出す必要がある場合、Rubyは6つのタスクを完了する方法を提供します.
1.Execメソッド:
Kernel#execメソッドは、現在のプロセスの例の代わりに指定されたコマンドを呼び出すことによって、次のようになります.
 
  
      $ irb
      >> exec 'echo "hello $HOSTNAME"'
         hello nate.local
      $

注目すべきは、execメソッドがirbプロセスの代わりにechoコマンドを使用してirbを終了することである.主な欠点は、rubyスクリプトからこのコマンドが成功したのか失敗したのか分からないことです.
2.Systemメソッド
Kernel#systemメソッドの操作コマンドは同じですが、現在のプロセスを上書きしないようにサブシェルを実行します.コマンドの実行に成功した場合はtrueを返し、そうでない場合はfalseを返します.
 
  
 $ irb            
  >> system 'echo "hello $HOSTNAME"'
  hello nate.local
  => true
  >> system 'false'
  => false
  >> puts $?
  256
  => nil
  >>

3.逆引用符(Backticks,Escキーの下にあるキー)
 
  
$ irb
  >> today = `date`
  => "Mon Mar 12 18:15:35 PDT 2007n"
  >> $?
  => #<:status: pid="25827,exited(0)">
  >> $?.to_i
  => 0

この方法は最も一般的な使い方だ.サブシェルでも実行されます.
4.IO#popen
 
  
  $ irb
  >> IO.popen("date") { |f| puts f.gets }
  Mon Mar 12 18:58:56 PDT 2007
  => nil

5.open3#popen3
 
  
$ irb
  >> stdin, stdout, stderr = Open3.popen3('dc')
  => [#<0x6e5474>, #<0x6e5438>, #<0x6e53d4>]
  >> stdin.puts(5)
  => nil
  >> stdin.puts(10)
  => nil
  >> stdin.puts("+")
  => nil
  >> stdin.puts("p")
  => nil
  >> stdout.gets
  => "15n"
0x6e53d4>0x6e5438>0x6e5474>

6.Open4#popen4
 
  
$ irb
  >> require "open4"
  => true
  >> pid, stdin, stdout, stderr = Open4::popen4 "false"
  => [26327, #<0x6dff24>, #<0x6dfee8>, #<0x6dfe84>]
  >> $?
  => nil
  >> pid
  => 26327
  >> ignored, status = Process::waitpid2 pid
  => [26327, #<:status: pid="26327,exited(1)">]
  >> status.to_i
  => 256
0x6dfe84>0x6dfee8>0x6dff24>