2011-05-06 92 views
3

在Ruby的popen/spawn中,如何合併STDOUT和STDERR作爲單個數據流,而不使用>2&1在Popen中合併標準輸出和stderr

在Python,這將是:

>>> import subprocess 
>>> subprocess.check_output('my_prog args', stderr=subprocess.STDOUT, shell=True) 

注意stderr說法。

I use Open3 - 因爲我不想要只是標準輸出 - 但它已經將它們分成兩個流。

回答

4

使用代碼從您的other question,在這裏你去:

cmd = 'a_prog --arg ... --arg2 ...' 
Open3.popen2({"MYVAR" => "a_value"}, "#{cmd}", {:err => [:child, :out]}) { |i,o| 
    # This output should include stderr as well 
    output = o.read() 
    repr = "$ #{cmd}\n#{output}" 
} 

一對夫婦的變化:

  1. popen2的第三個參數將重定向錯誤輸出到stdoutl。請注意,它需要衍生的進程的標準輸出,而不是全系統的標準輸出,所以你需要指定:child:out
  2. 您需要使用.popen2,而不是.popen3,因爲它似乎如果包括第三重定向被忽略e選項標準錯誤
  3. 因爲你使用.popen2,你只能通過|i,o|到塊:
1

有點晚了,但看看Open3.popen2e - docs

此行爲與popen3完全相同,但合併stderrstdout作爲塊的第二個參數。

因此,你可以簡單地做

cmd = 'a_prog --arg ... --arg2 ...' 
Open3.popen2e(cmd) { |input,output| 
# Process as desired, with output containing stdout and stderr 
} 
相關問題