Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Temporarily suppress STDOUT and STDERR (ruby)
# Temporarily redirects STDOUT and STDERR to /dev/null
# but does print exceptions should there occur any.
# Call as:
# suppress_output { puts 'never printed' }
#
def suppress_output
original_stderr = $stderr.clone
original_stdout = $stdout.clone
$stderr.reopen(File.new('/dev/null', 'w'))
$stdout.reopen(File.new('/dev/null', 'w'))
yield
ensure
$stdout.reopen(original_stdout)
$stderr.reopen(original_stderr)
end
@rileytg

This comment has been minimized.

Copy link

@rileytg rileytg commented Mar 11, 2017

very nice. i used this for running my sinatra app during some high level cucumber tests. these test used to mix in the sinatra logs with my test output, got very annoying/messy

@iamtheiconoclast

This comment has been minimized.

Copy link

@iamtheiconoclast iamtheiconoclast commented Dec 14, 2017

Fantastic! Thank you, this is exactly what I was looking for. (I also used it to stop output from an inline Sinatra app :)

I believe it can be simplified quite a bit:

  • the begin / end is unnecessary since the rescue and ensure clauses can be hooked onto the method itself (I love Ruby!)
  • the rescue clause is unnecessary since the ensure clause will run anyway before the exception is passed on up the call stack, meaning output will be turned back on before the exception has a chance to get caught (or not) by the calling code
  • the retval is unnecessary since the return value of the method will be the result of yielding to the block anyway
  • which means that retval = is also unnecessary

Putting that all together, it now looks like this:

def suppress_output
  original_stdout, original_stderr = $stdout.clone, $stderr.clone
  $stderr.reopen File.new('/dev/null', 'w')
  $stdout.reopen File.new('/dev/null', 'w')
  yield
ensure
  $stdout.reopen original_stdout
  $stderr.reopen original_stderr
end
@rebelwarrior

This comment has been minimized.

Copy link

@rebelwarrior rebelwarrior commented Jan 24, 2018

@nav-mike

This comment has been minimized.

Copy link

@nav-mike nav-mike commented Aug 23, 2018

👍 🎉

@robsimpsondev

This comment has been minimized.

Copy link

@robsimpsondev robsimpsondev commented Oct 28, 2018

Nice one guys! Very useful :)

@gangelo

This comment has been minimized.

Copy link

@gangelo gangelo commented Jan 31, 2019

Awesome little ditty.

@nancy-gomez

This comment has been minimized.

Copy link

@nancy-gomez nancy-gomez commented May 28, 2019

How can this be edited to instead of just suppressing by sending to dev/null, it instead returned the output so that it can be stored in a variable? Can this be done without redirecting to a file?

@EricDuminil

This comment has been minimized.

Copy link

@EricDuminil EricDuminil commented Jul 8, 2019

@moertel

This comment has been minimized.

Copy link
Owner Author

@moertel moertel commented Aug 30, 2019

@iamtheiconoclast I realise I never looked at the comments here. 😅 Thanks for your suggested simplifications; I've amended the Gist to reflect them.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment