ruby stdout stderr output-redirect

Diferencia entre $ stdout y STDOUT en Ruby



stderr output-redirect (3)

En Ruby, ¿cuál es la diferencia entre $stdout (precedido por un signo de dólar) y STDOUT (en mayúsculas)? Al hacer la redirección de salida, ¿cuál debería usarse y por qué? Lo mismo STDERR para $stderr y STDERR .

Editar: acabo de encontrar una pregunta relacionada .


Tanto $stdout como STDOUT tienen diferentes significados. La documentación de Ruby es bastante clara sobre este tema:

  • $stdout - La salida estándar actual.
  • STDOUT - La salida estándar. El valor predeterminado para $ stdout.

Cuando desee escribir en la salida estándar, significa en realidad la salida estándar actual , por lo tanto, debe escribir en $stdout .

STDOUT no es inútil también. Almacena el valor predeterminado para $stdout . Si alguna vez reasigna $stdout , puede restaurarlo al valor anterior con $stdout = STDOUT .

Además, hay una variable predefinida más:

  • $> - La salida predeterminada para print, printf, que es $stdout por defecto.

Sin embargo, parece que en Ruby 2.3 simplemente se comporta como un alias para $stdout . La reasignación de $stdout cambia el valor de $> y viceversa.


$stdout es una variable global que representa el resultado estándar actual. STDOUT es una constante que representa la salida estándar y generalmente es el valor predeterminado de $stdout .

Con STDOUT como constante, no debe volver a definirlo, sin embargo, puede volver a definir $stdout sin errores / advertencias (la redefinición de STDOUT generará una advertencia). por ejemplo, puedes hacer:

$stdout = STDERR

Lo mismo vale para $stderr y STDERR

Entonces, para responder la otra parte de su pregunta, use las variables globales para redirigir la salida, no las constantes. Solo tenga cuidado de volver a cambiarlo en su código, redefinir las variables globales puede afectar otras partes de su aplicación.


  • STDOUT es una constante global, por lo que no debe modificarse.
  • $stdout es una variable predefinida, por lo que se puede cambiar.

Si está utilizando el intérprete de comandos para hacer la redirección:

$ ruby test.rb > test.log

entonces no importa cuál use como el descriptor de archivo para su script que se está determinando antes de que se ejecute su script.

Sin embargo, si intenta cambiar el descriptor de archivo para STDOUT del sistema operativo desde su script Ruby, por ejemplo, para enviar resultados a un conjunto rotatorio de archivos de registro basados ​​en el día actual de la semana, entonces querrá asegurarse usted usa $stdout .