Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I temporarily redirect stderr in Ruby?

Tags:

ruby

stderr

I'd like to temporarily redirect stderr in a Ruby script for the duration of a block, ensuring that I reset it to its original value at the end of the block.

I had trouble finding how to do this in the ruby docs.

like image 610
horseyguy Avatar asked Dec 16 '10 09:12

horseyguy


People also ask

How do I redirect stderr?

Understanding the concept of redirections and file descriptors is very important when working on the command line. To redirect stderr and stdout , use the 2>&1 or &> constructs.

How do I redirect stderr to a file?

Redirecting stdout and stderr to a file: The I/O streams can be redirected by putting the n> operator in use, where n is the file descriptor number. For redirecting stdout, we use “1>” and for stderr, “2>” is added as an operator.

How do I redirect stderr and stdout?

The regular output is sent to Standard Out (STDOUT) and the error messages are sent to Standard Error (STDERR). When you redirect console output using the > symbol, you are only redirecting STDOUT. In order to redirect STDERR, you have to specify 2> for the redirection symbol.

What is stdout in Ruby?

The $stdout is a global variable which holds the standard output stream. printing2.rb. #!/usr/bin/ruby $stdout.print "Ruby language\n" $stdout.puts "Python language" We print two lines using the $stdout variable. Ruby has another three methods for printing output.


1 Answers

In Ruby, $stderr refers to the output stream that is currently used as stderr, whereas STDERR is the default stderr stream. It is easy to temporarily assign a different output stream to $stderr.

require "stringio"  def capture_stderr   # The output stream must be an IO-like object. In this case we capture it in   # an in-memory IO object so we can return the string value. You can assign any   # IO object here.   previous_stderr, $stderr = $stderr, StringIO.new   yield   $stderr.string ensure   # Restore the previous value of stderr (typically equal to STDERR).   $stderr = previous_stderr end 

Now you can do the following:

captured_output = capture_stderr do   # Does not output anything directly.   $stderr.puts "test" end  captured_output #=> "test\n" 

The same principle also works for $stdout and STDOUT.

like image 67
molf Avatar answered Oct 06 '22 11:10

molf