如果我这样做:
output = %x{some_script}
...然后我将这些东西打印到存储在output
中的stdout;但我不看到它出现在屏幕上。
另一方面,如果我这样做:
success = system "some_script"
...然后我看到输出出现在屏幕上,但我没有将它存储在变量中(success
只保留一个布尔值)。
有两种方法可以同时获得两者吗?我知道我可以做到这一点:
output = %x{some_script}
puts output
但问题是some_script
可能是一个非常长时间运行的脚本,在这种情况下,我会看到 nothing ,直到整个过程完成。我希望看到生成的输出,以及完成后将它全部存储在output
变量中。
答案 0 :(得分:8)
这是IO.popen
的解决方案:
require 'stringio'
output = StringIO.new
IO.popen("ls") do |pipe|
pipe.each do |line|
output.puts line
puts line
end
end
puts output.string # => Outputs the contents of `output` as a string
答案 1 :(得分:1)
你可以monkeypatch Kernel::puts
,但我只能想到一种存储结果的全局方式:
class Kernel
alias_method :old_puts, :puts
def puts(*args)
old_puts args
$output << args
end
end