Хотя использование обратных кавычек или popen часто является тем, что вам действительно нужно, на самом деле оно не отвечает на заданный вопрос. Могут быть веские причины для захвата system
вывода (возможно, для автоматического тестирования). Немного погуглив нашел ответ Я думал, что выложу здесь для блага других.
Так как мне нужно было это для тестирования, мой пример использует настройку блока для захвата стандартного вывода, поскольку фактический вызов system
скрыт в тестируемом коде:
require 'tempfile'
def capture_stdout
stdout = $stdout.dup
Tempfile.open 'stdout-redirect' do |temp|
$stdout.reopen temp.path, 'w+'
yield if block_given?
$stdout.reopen stdout
temp.read
end
end
Этот метод захватывает любой вывод в данном блоке, используя временный файл для хранения фактических данных. Пример использования:
captured_content = capture_stdout do
system 'echo foo'
end
puts captured_content
Вы можете заменить вызов system
на любой внутренний вызов system
. Вы также можете использовать аналогичный метод для захвата stderr
, если хотите.