2011-05-06 121 views
12

在Ruby命令行,我想能够:运行自定义环境

  1. 运行命令行(通过壳)
  2. 捕获两个输出和错误(优选为单流),而无需使用>2&1(从而未能在这里的一些命令)
  3. 运行额外enviornment变量(不修改Ruby程序本身的环境)

我了解到,Open3允许我做1和2

   cmd = 'a_prog --arg ... --arg2 ...' 
       Open3.popen3("#{cmd}") { |i,o,e| 
       output = o.read() 
       error = e.read() 
       # FIXME: don't want to *separate out* stderr like this 
       repr = "$ #{cmd}\n#{output}" 
       } 

我还了解到,popen允许你传递一个环境,但不指定命令行的时候。

如何编写完成这三项功能的代码?

...

换句话说,什么是Ruby相当于下面的Python代码吗?

>>> import os, subprocess 
>>> env = os.environ.copy() 
>>> env['MYVAR'] = 'a_value' 
>>> subprocess.check_output('ls -l /notexist', env=env, stderr=subprocess.STDOUT, shell=True) 
+0

'FIXME'现在是一个单独的问题:http://stackoverflow.com/questions/5917993 – 2011-05-06 23:22:06

回答

13

Open.popen3选择性地接受一个哈希作为第一个参数(在这种情况下,您的命令将是第二个参数:

cmd = 'a_prog --arg ... --arg2 ...' 
Open3.popen3({"MYVAR" => "a_value"}, "#{cmd}") { |i,o,e| 
    output = o.read() 
    error = e.read() 
    # FIXME: don't want to *separate out* stderr like this 
    repr = "$ #{cmd}\n#{output}" 
} 

Open使用Process.spawn启动命令,所以你可以看一下documentation for Process.spawn看到它的所有选项

+0

这给出了一个错误:'open3.rb:67:在'exec'中:can 't co将哈希转换为字符串(TypeError)'。请参阅https://gist.github.com/959977 – 2011-05-06 23:12:26

+1

实际上,这是Ruby 1.8,但它适用于Ruby 1.9。让我试试它的实际代码......(我必须阅读1.8的文档) – 2011-05-06 23:15:29

+0

是的,它是1.9特定的。看起来1.8在Open3中使用了更小更有限的一组功能。 – 2011-05-06 23:25:28