2014-06-17 55 views
-1

我想在ruby代码里执行一个shell脚本并返回结果。 I am为此使用Open3。 下面是代码:在红宝石代码里面执行一个shell脚本

#!/usr/bin/env ruby 

require 'rubygems' 
require 'uri' 
require 'net/http' 

require 'open3' # require 'open3' in 1.9 
AppArgs = Array.new 

def get()  
    source = Net::HTTP.get('integration.twosmiles.com', '/status') 
    _shellScript = "grep 'commit' status.html" 
    fileHtml = File.new("status.html", "w+") 
    fileHtml.puts source 
    Open3.popen3(_shellScript) do |stdin, stdout, stderr| 
    puts stdout 
    puts stdin 
    puts stderr 

    end 
end 

get() 

但它打印

#<IO:0x00000000a41ca8> 
#<IO:0x00000000a41cf8> 
#<IO:0x00000000a41c30> 

我想我搜索的stdout的叮咬。如何实现这一目标?

回答

1

如果您希望使用Open3,他们documentation page告诉标准输出,标准错误,......是流:

在你的代码,你可以简单地做:

puts stdout.read 
puts stdin.read 
puts stderr.read 

完全题外话,但从IT安全的角度确保你有足够的检查,你不应该真的执行从互联网上'grepped'的命令。

1

如果输出很短,要在整个输出缓冲成一个字符串,你可以简单地使用反引号:

`#{_shellScript}` 

您也可以重定向的所有错误输出到标准输出如下

`#{_shellScript} &2>1` 

这里的反引号通过和其他替代方法执行的快速概览:

Ruby, Difference between exec, system and %x() or Backticks