我正在尝试运行系统命令(rspec
)并将其输出实时打印到终端 和彩色,但我还希望以字符串形式捕获其打印输出以供日后使用。
目前它看起来像这样:
cmd = "rspec #{ARGV.join(' ')}"
system cmd
raw = `#{cmd}`
这样可行,但由于RSpec需要几秒钟才能完成,因此将时间加倍并不是无关紧要的。有没有办法让system
来电打印到终端,还有其输出可用于捕获?
答案 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流块。