在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 - 因为我不想只是标准输出 - 但它已经将它们分成两个流。
答案 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}"
}
一些改变:
popen2
的第三个参数会将stderr重定向到stdoutl。请注意,它必须是生成进程的stdout,而不是系统范围的stdout,因此您需要指定:child
的{{1}} :out
而不是.popen2
,因为如果您为stderr添加第3个.popen3
选项,似乎会忽略重定向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
}