我正在尝试运行系统命令(rspec
)并将其实时的、带有颜色的输出打印到终端,但我也想捕获它的输出并以字符串形式保存以供以后使用。
目前看起来像这样:
cmd = "rspec #{ARGV.join(' ')}"
system cmd
raw = `#{cmd}`
这个方法可行,但由于RSpec需要几秒钟才能完成,所以将其加倍时间不可忽视。有没有办法让system
调用在终端上打印输出,但同时也可以捕获其输出呢?
原来有一个名为 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
你应该使用Open3#popen2e。这种方法可以产生一个用于stdin的流,一个用于stdout和stderr的流(它们被合并了),以及一个等待线程。
你可以安全地关闭stdin流并忽略等待线程。你可以按块读取合并的stdout和stderr流。
print raw = `#{cmd}`
吗? - August