如何将控制台输出显示到stdout并将其存储在变量中?

时间:2011-09-01 20:25:27

标签: ruby console rake stdout

如果我这样做:

output = %x{some_script}

...然后我将这些东西打印到存储在output中的stdout;但我看到它出现在屏幕上。

另一方面,如果我这样做:

success = system "some_script"

...然后我看到输出出现在屏幕上,但我没有将它存储在变量中(success只保留一个布尔值)。

有两种方法可以同时获得两者吗?我知道我可以做到这一点:

output = %x{some_script}
puts output

但问题是some_script可能是一个非常长时间运行的脚本,在这种情况下,我会看到 nothing ,直到整个过程完成。我希望看到生成的输出,以及完成后将它全部存储在output变量中。

2 个答案:

答案 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