Ruby中$ stdout和STDOUT之间的区别

jrd*_*oko 87 ruby stdout stderr output-redirect

在Ruby中,$stdout(以美元符号开头)和STDOUT(在所有大写字母中)之间有什么区别?在进行输出重定向时,应该使用哪个以及为什么?这同样适用于$stderrSTDERR.

编辑:刚刚找到一个相关的问题.

Bri*_*ian 103

$stdout是表示当前标准输出的全局变量. STDOUT是表示标准输出的常量,通常是默认值$stdout.

随着STDOUT是恒定的,你不应该重新定义它,但是,你可以重新定义$stdout没有错误/警告(重新定义STDOUT将引发警告).例如,你可以这样做:

$stdout = STDERR
Run Code Online (Sandbox Code Playgroud)

这同样适用于$stderrSTDERR


因此,要回答问题的其他部分,请使用全局变量来重定向输出,而不是常量.请小心在代码中进一步更改它,重新定义全局变量可能会影响应用程序的其他部分.

  • @jrdioko:你是对的.显然,我不仅每天都在学习新东西,我每天都会忘记一些事情:-) (9认同)
  • 刚刚发现了[另一个问题的评论](http://stackoverflow.com/questions/4279604/what-is-the-difference-between-stdin-and-stdin-in-ruby/4279689#4279689) stdout`和`$>`是别名,所以重新分配会影响另一个. (8认同)
  • 实际上,如果你想重定向输出,你应该使用`$>`,默认输出流,而不是`$ stdout`. (3认同)
  • 阅读更多,听起来最好使用[IO #reopen](http://www.ruby-doc.org/core/classes/IO.html#M000890)而不是简单的任务. (2认同)

sha*_*xxv 5

  • STDOUT 是一个全局常量,所以不应该改变.
  • $stdout 是一个预定义的变量,因此可以更改.

如果您使用shell进行重定向:

$ ruby test.rb > test.log
Run Code Online (Sandbox Code Playgroud)

那么在您执行脚本之前确定您使用哪一个作为脚本的文件描述符并不重要.

但是,如果您尝试从Ruby脚本中更改操作系统的STDOUT的文件描述符,例如根据当前的当天将输出发送到一组旋转的日志文件,那么您需要确保你用$stdout.

  • "STDOUT是一个全球常数,所以它不会改变".这是一个常数,可以更改,但会发出警告.`STDOUT = $ stderr(irb):1:警告:al#=>#<IO:<STDERR >>常数STDOUT >> STDOUT#=>#<IO:<STDERR >> (5认同)

ska*_*lee 5

两者$stdoutSTDOUT具有不同的含义。 Ruby的文档对此主题非常清楚:

  • $stdout –当前标准输出。
  • STDOUT–标准输出。$ stdout的默认值。

要写入标准输出时,实际上是指当前的标准输出,因此应写入$stdout

STDOUT也不是没有用。它存储的默认值$stdout。如果您曾经进行过重新分配$stdout,则可以使用将其恢复到以前的值$stdout = STDOUT

此外,还有一个预定义的变量:

  • $>–打印的默认输出printf,$stdout默认情况下为默认值。

但是,在Ruby 2.3中,它只是充当的别名$stdout。重新分配会$stdout更改的值,$>反之亦然。