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

3

我正在尝试运行系统命令(rspec)并将其实时的、带有颜色的输出打印到终端,但我也想捕获它的输出并以字符串形式保存以供以后使用。

目前看起来像这样:

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

这个方法可行,但由于RSpec需要几秒钟才能完成,所以将其加倍时间不可忽视。有没有办法让system调用在终端上打印输出,但同时也可以捕获其输出呢?


你尝试过使用print raw = `#{cmd}` 吗? - August
那不会以彩色实时的方式打印输出。 - PJSCopeland
2个回答

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

你应该使用Open3#popen2e。这种方法可以产生一个用于stdin的流,一个用于stdout和stderr的流(它们被合并了),以及一个等待线程。

你可以安全地关闭stdin流并忽略等待线程。你可以按块读取合并的stdout和stderr流。


有用,但仍然不是彩色的 - PJSCopeland

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