2011-05-06 133 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