Was ist in Ruby der Unterschied zwischen $stdout
(vorangestellt von einem Dollarzeichen) und STDOUT
(in Großbuchstaben)? Welche sollte bei der Ausgabeumleitung verwendet werden und warum? Das gilt auch für $stderr
und STDERR
.
Bearbeiten: Habe gerade eine verwandte Frage gefunden .
ruby
stdout
stderr
output-redirect
jrdioko
quelle
quelle
$stdout
undSTDOUT
vs$stdin
undSTDIN
symetrisch sind, die Unterschiede zwischen$stdout
und$>
vs$stdin
und$<
jedoch nicht.Antworten:
$stdout
ist eine globale Variable , die die aktuelle Standardausgabe darstellt.STDOUT
ist eine Konstante, die die Standardausgabe darstellt, und ist normalerweise der Standardwert von$stdout
.Da
STDOUT
es sich um eine Konstante handelt, sollten Sie sie nicht neu definieren. Sie können sie jedoch$stdout
ohne Fehler / Warnungen neu definieren (eine NeudefinitionSTDOUT
löst eine Warnung aus). Sie können beispielsweise Folgendes tun:Gleiches gilt für
$stderr
undSTDERR
Um den anderen Teil Ihrer Frage zu beantworten, verwenden Sie die globalen Variablen, um die Ausgabe umzuleiten, nicht die Konstanten. Achten Sie nur darauf, dass Sie es später in Ihrem Code wieder ändern. Eine Neudefinition globaler Variablen kann sich auf andere Teile Ihrer Anwendung auswirken.
quelle
$>
den Standardausgabestream verwenden, nicht$stdout
.$stdout
und$>
ist. Wenn Sie also eine neu zuweisen, wirkt sich dies auf die andere aus.IO#reopen
im Falle von zu verwenden$stdout
? Ich bin mit dieser Meinung überhaupt nicht einverstanden. Die$stdout.reopen
Methode mutiert den Empfänger und dies wirkt sich auch aus,STDOUT
wenn Sie zuvor keine Neuzuweisung vorgenommen$stdout
haben. Sie sind nicht als Synonyme gedacht, es ist nichts Schlimmes, wenn sie aufgrund der Zuweisung unterschiedliche Werte haben und wenn Sie das öffnenSTDOUT
, brechen Sie den Zweck.STDOUT
ist eine globale Konstante und sollte daher nicht geändert werden.$stdout
ist eine vordefinierte Variable, die geändert werden kann.Wenn Sie die Shell zum Umleiten verwenden:
Dann spielt es keine Rolle, welche Sie als Dateideskriptor für Ihr Skript verwenden, bevor Ihr Skript ausgeführt wird.
Wenn Sie jedoch versuchen, den Dateideskriptor für STDOUT des Betriebssystems in Ihrem Ruby-Skript zu ändern, um beispielsweise die Ausgabe basierend auf dem aktuellen Wochentag an einen rotierenden Satz von Protokolldateien zu senden, sollten Sie dies sicherstellen Sie verwenden
$stdout
.quelle
STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
Beide
$stdout
undSTDOUT
haben unterschiedliche Bedeutungen. Rubys Dokumentation zu diesem Thema ist ziemlich klar:Wenn Sie in die Standardausgabe schreiben möchten, meinen Sie tatsächlich die aktuelle Standardausgabe, daher sollten Sie in diese schreiben
$stdout
.STDOUT
ist auch nicht nutzlos. Es speichert den Standardwert für$stdout
. Wenn Sie jemals neu zuweisen$stdout
, können Sie den vorherigen Wert mit wiederherstellen$stdout = STDOUT
.Darüber hinaus gibt es noch eine vordefinierte Variable:
Es sieht jedoch so aus, als ob es sich in Ruby 2.3 einfach als Alias für verhält
$stdout
. Durch Neuzuweisung$stdout
wird der Wert von geändert$>
und umgekehrt.quelle