合并stdout和stderr在Popen

Rei*_*ica 3 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)
Run Code Online (Sandbox Code Playgroud)

注意这个stderr论点.

我使用Open3 - 因为我不想只是 stdout - 但它已经将它们分成两个流.

Dyl*_*kow 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}"
}
Run Code Online (Sandbox Code Playgroud)

一对夫妇改变:

  1. popen2将stderr重定向到stdoutl 的第三个参数.请注意,它需要是生成进程的stdout,而不是系统范围的stdout,所以你需要指定:child's:out
  2. 如果包含stderr 的第3个选项,则需要使用.popen2而不是.popen3看起来忽略重定向e
  3. 因为你正在使用.popen2,你只能传递|i,o|到块: