Кто-то первоначально прокомментировал мой пост, предлагая использовать IO.reopen . Это сработало для меня. Человек, к сожалению, с тех пор удалил свой комментарий, поэтому я публикую более подробную функцию, которую я использовал в конце:
def silence_stdout(log = '/dev/null')
old = $stdout.dup
$stdout.reopen(File.new(log, 'w'))
yield
$stdout = old
end
Использование:
silence_stdout { foo } # Won't be displayed, won't be logged.
silence_stdout('log.txt') { bar } # Won't be displayed, logged in log.txt.