最初有人评论我的帖子,建议使用IO.reopen。这对我有用。不幸的是,此人删除了他/她的评论,因此我将发布最后使用的更详细的功能:
def silence_stdout(log = '/dev/null')
old = $stdout.dup
$stdout.reopen(File.new(log, 'w'))
yield
$stdout = old
end
Run Code Online (Sandbox Code Playgroud)
用法:
silence_stdout { foo } # Won't be displayed, won't be logged.
silence_stdout('log.txt') { bar } # Won't be displayed, logged in log.txt.
Run Code Online (Sandbox Code Playgroud)