Rubyの$ stdoutとSTDOUTの違い


88

Rubyでは、$stdout(前にドル記号が付いている)とSTDOUT(すべて大文字の)の違いは何ですか?出力のリダイレクトを行う場合、どちらを使用する必要がありますか。それはなぜですか。同じことがのために行く$stderrSTDERR

編集:関連する質問が見つかりました。



@theTinManやや重複しています。しかし、間の違いに対しことに留意しなければならない$stdoutSTDOUT$stdinSTDIN対称的です、との違い$stdout$>$stdinとは$<ありません。
スケーリー2016

回答:


105

$stdoutあるグローバル変数の現在の標準出力を表しています。 標準出力を表す定数STDOUTで、通常はのデフォルト値です。$stdout

STDOUT一定である、あなたは、しかし、あなたは再定義することができ、それを再定義するべきではありません$stdout、エラー/警告(再定義することなく、STDOUT警告を発生させます)。たとえば、次のことができます。

$stdout = STDERR

同じことがのために行く$stderrと、STDERR


したがって、質問の他の部分に答えるには、定数ではなく、グローバル変数を使用して出力をリダイレクトします。コードでさらに変更するように注意してください。グローバル変数を再定義すると、アプリケーションの他の部分に影響を与える可能性があります。


3
実際、出力をリダイレクトしたい場合$>は、デフォルトの出力ストリームではなく、を使用する必要があります$stdout
イェルクWミッターク

9
ただ、見つかった別の質問にコメント言う$stdout$>、エイリアスがあるのので、一方が他方に影響を与えます再割り当てします。
jrdioko

9
@jrdioko:その通りです。どうやら、私は何か、毎日新しい、私も毎日何かを忘れ:-)学ぶだけではなく
イェルクWミッターク

2
さらに読むと、単純な割り当ての代わりにIO#reopenを使用するほうがいいようです。
jrdioko

@jrdiokoの場合、なぜ使用IO#reopenした方が良いと思います$stdoutか?私はこの意見に全く同意しません。$stdout.reopenメソッドの変異し、その受信機およびそれにも影響しますSTDOUT、あなたが再割り当てされていない場合$stdoutの前に。それらは同義語であることを意味するものではなく、割り当てのためにそれらが異なる値を保持する場合、それはSTDOUTあなたがそれを再オープンすることによってその目的を壊していることは悪いことではありません。
スケーリー2016

5
  • STDOUT グローバル定数なので、変更しないでください。
  • $stdout は事前定義された変数なので、変更できます。

シェルを使用してリダイレクトを行う場合:

$ ruby test.rb > test.log

スクリプトを実行する前に、スクリプトのファイル記述子としてどちらを使用するかを決定する必要はありません。

ただし、Rubyスクリプト内からOSのSTDOUTのファイル記述子を変更しようとしている場合、たとえば、現在の曜日に基づいてログファイルのローテーションセットに出力を送信する場合は、確認する必要があります。あなたが使用します$stdout


5
「STDOUTはグローバル定数なので、変更されません」。これは定数であり、変更できますが、警告が発行されます。STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
ティンマン

ああ、そうです、「だから、それは変更されるべきではない」と言うべきです。ありがとう!
shakerlxxv 11/07/13

5

両方$stdoutSTDOUT異なる意味を持っています。 Rubyのドキュメントは、このトピックについてはかなり明確です。

  • $stdout –現在の標準出力。
  • STDOUT–標準出力。$ stdoutのデフォルト値。

標準出力に書き込む場合は、実際には現在の標準出力を意味するため、に書き込む必要があります$stdout

STDOUTも無駄ではありません。のデフォルト値を格納します$stdout。を再割り当てする場合$stdoutは、を使用して以前の値に復元できます$stdout = STDOUT

さらに、もう1つ事前定義された変数があります。

  • $>–印刷のデフォルト出力であるprintf。これは$stdoutデフォルトです。

ただし、Ruby 2.3では、単にのエイリアスとして動作するように見え$stdoutます。再割り当て$stdoutすると、の値が変更され、$>逆も同様です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.