In Ruby, what is the difference between $stdout
(preceded by a dollar sign) and STDOUT
(in all caps)? When doing output redirection, which should be used and why? The same goes for $stderr
and STDERR
.
Edit: Just found a related question.
In Ruby, what is the difference between $stdout
(preceded by a dollar sign) and STDOUT
(in all caps)? When doing output redirection, which should be used and why? The same goes for $stderr
and STDERR
.
Edit: Just found a related question.
$stdout
is a global variable that represents the current standard output.STDOUT
is a constant representing standard output and is typically the default value of$stdout
.With
STDOUT
being a constant, you shouldn't re-define it, however, you can re-define$stdout
without errors/warnings (re-definingSTDOUT
will raise a warning). for example, you can do:Same goes for
$stderr
andSTDERR
So, to answer the other part of your question, use the global variables to redirect output, not the constants. Just be careful to change it back further on in your code, re-defining global variables can impact other parts of your application.
STDOUT
is a global constant, so it should not be changed.$stdout
is a predefined variable, so it can be changed.If you are using the shell to do redirection:
then it doesn't matter which one you use as the file descriptor for your script is being determined before your script is executed.
However, if you are trying to change the file descriptor for the OS's STDOUT from within your Ruby script, for example to send output to a rotating set of log files based on the current day of the week, then you'll want to make sure you use
$stdout
.Both
$stdout
andSTDOUT
have different meanings. Ruby's documentation is pretty clear on this topic:When you want to write to the standard output, then you actually mean the current standard output, thus you should write to
$stdout
.STDOUT
isn't useless too. It stores the default value for$stdout
. If you ever reassign$stdout
, then you can restore it to the previous value with$stdout = STDOUT
.Furthermore, there's one more predefined variable:
However it looks like in Ruby 2.3 it simply behaves as an alias for
$stdout
. Reassigning$stdout
changes the value of$>
and vice versa.