Как я могу отобразить вывод консоли на стандартный вывод и сохранить его в переменной? - PullRequest
6 голосов
/ 02 сентября 2011

Если я сделаю это:

output = %x{some_script}

... тогда у меня есть материал, напечатанный на стандартный вывод, который хранится в output; но я не вижу, что это появляется на экране.

С другой стороны, если я сделаю это:

success = system "some_script"

... затем я вижу вывод на экране, но я не храню его в переменной (success содержит только логическое значение).

Есть ли способ получить оба? Я знаю, что мог бы сделать это:

output = %x{some_script}
puts output

Но проблема в том, что some_script может быть довольно длительным сценарием, и в этом случае я вижу ничего , пока все не закончится. Я бы предпочел, чтобы выходные данные отображались в том виде, в каком они были получены, и когда они будут завершены, все они будут сохранены в переменной output.

Ответы [ 2 ]

8 голосов
/ 02 сентября 2011

Это решение с 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 голос
/ 02 сентября 2011

Вы можете сделать monkeypatch Kernel::puts, но я могу думать только о хитром глобальном способе сохранения результатов:

class Kernel
  alias_method :old_puts, :puts
  def puts(*args)
    old_puts args
    $output << args
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...