使用Popen合并标准输出和标准错误输出

3
在Ruby的popen/spawn中,如何将标准输出和标准错误合并为单个流而不使用>2&1
在Python中,这样做的方法是:
>>> import subprocess
>>> subprocess.check_output('my_prog args', stderr=subprocess.STDOUT, shell=True)

请注意stderr参数。 我使用Open3 - 因为我不仅仅需要标准输出(stdout),而是需要标准错误(stderr) - 但它已经将它们分成了两个流。
2个回答

5

使用你在另一个问题中提供的代码,这里是您需要的:

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重定向到stdout。请注意,它需要是生成的进程的stdout,而不是系统范围的stdout,因此您需要指定:child:out
  2. 如果您包括第3个e选项用于stderr,则需要使用.popen2而不是.popen3,因为似乎会忽略重定向
  3. 因为您正在使用.popen2,所以只需将|i,o|传递给块:

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接