Ruby:捕获system()的输出并将其打印在终端中

时间:2014-12-16 01:55:37

标签: ruby shell stdout

我正在尝试运行系统命令(rspec)并将其输出实时打印到终端 彩色,但我希望以字符串形式捕获其打印输出以供日后使用。

目前它看起来像这样:

cmd = "rspec #{ARGV.join(' ')}"
system cmd
raw = `#{cmd}`

这样可行,但由于RSpec需要几秒钟才能完成,因此将时间加倍并不是无关紧要的。有没有办法让system来电打印到终端,还有其输出可用于捕获?

2 个答案:

答案 0 :(得分:2)

事实证明,PTY.spawn方法与Open3#popen2e非常相似,但也有颜色。这是我的整个区块:

require 'pty'

raw = ''
PTY.spawn(cmd) do |stdout_err, stdin, pid|
  begin
    while (char = stdout_err.getc)
      raw << char
      print char
    end
  rescue Errno::EIO # always raised when PTY runs out of input
  ensure
    Process.waitpid pid # Wait for PTY to complete before continuing
  end
end

答案 1 :(得分:1)

您应该使用Open3#popen2e。这个方法产生stdin的流,stdout和stderr的流(它们被合并)和服务员线程。

您可以安全地关闭stdin流并忽略服务员线程。您可以按块读取合并的stdout和stderr流块。