首先,我建议使用Open3中的一种方法。
我capture3
用于我的一个系统,我们需要获取许多命令行应用程序的 STDOUT 和 STDERR 的输出。
如果您需要管道子流程,请尝试popen3
其他“管道”命令之一。
下面是一些代码来说明如何使用popen2
,它忽略了 STDERR 通道。如果您想跟踪它,请使用popen3
:
require 'open3'
output = []
exit_status = Open3.popen2(ENV, "ruby -e '3.times{|i| p i; sleep 1}'") { |stdin, stdout, thr|
stdin.close
stdout.each_line do |o|
o.chomp!
output << o
puts %Q(Read from pipe: "#{ o }")
end
thr.value
}
puts "Output array: #{ output.join(', ') }"
puts "Exit status: #{ exit_status }"
运行输出:
Read from pipe: "0"
Read from pipe: "1"
Read from pipe: "2"
Output array: 0, 1, 2
Exit status: pid 43413 exit 0
示例代码显示了一种方法。
没有必要使用each_line
,但它演示了如何逐行读取,直到子流程关闭其 STDOUT。
capture3
不接受块;它一直等到子进程关闭其输出并退出,然后返回内容,这在您想要阻塞进程时非常有用。popen2
并且popen3
有阻塞和非阻塞版本,但我这里只展示非阻塞版本来演示如何读取和输出来自子进程的内容。