合并stdout和stderr在Popen

时间:2011-05-06 23:21:31

标签: ruby stdout popen stderr

在Ruby的popen / spawn中,如何将STDOUT和STDERR合并为单个流而不使用>2&1

在Python中,这将是:

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

注意stderr参数。

I use Open3 - 因为我不想只是标准输出 - 但它已经将它们分成两个流。

2 个答案:

答案 0 :(得分:5)

使用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的第三个参数会将stderr重定向到stdoutl。请注意,它必须是生成进程的stdout,而不是系统范围的stdout,因此您需要指定:child的{​​{1}}
  2. 您需要使用:out而不是.popen2,因为如果您为stderr添加第3个.popen3选项,似乎会忽略重定向
  3. 由于您使用的是e,因此只能将.popen2传递给该块:

答案 1 :(得分:1)

有点晚了,但请看Open3.popen2e - docs

此行为与popen3完全相同,但将stderr stdout合并为块的第二个参数。

所以你可以简单地做

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