Jaka jest różnica między $stdout
(poprzedzonymi znakiem dolara) a STDOUT
(wielkimi literami) w Rubim ? Podczas przekierowywania wyjścia, które powinno być używane i dlaczego? To samo dotyczy $stderr
i STDERR
.
Edycja: właśnie znalazłem powiązane pytanie .
ruby
stdout
stderr
output-redirect
jrdioko
źródło
źródło
$stdout
iSTDOUT
vs$stdin
iSTDIN
są symetryczne, różnice między$stdout
i$>
vs$stdin
i$<
nie są.Odpowiedzi:
$stdout
jest zmienną globalną, która reprezentuje bieżące standardowe wyjście.STDOUT
jest stałą reprezentującą standardowe wyjście i zwykle jest wartością domyślną$stdout
.Ponieważ
STDOUT
jest to stała, nie należy jej ponownie definiować, jednak można ją zdefiniować ponownie$stdout
bez błędów / ostrzeżeń (ponowne zdefiniowanieSTDOUT
spowoduje ostrzeżenie). na przykład możesz:To samo dotyczy
$stderr
iSTDERR
Tak więc, aby odpowiedzieć na drugą część pytania, użyj zmiennych globalnych do przekierowania danych wyjściowych, a nie stałych. Po prostu uważaj, aby zmienić to z powrotem w kodzie, ponowne zdefiniowanie zmiennych globalnych może wpłynąć na inne części aplikacji.
źródło
$>
domyślnego strumienia wyjściowego, a nie$stdout
.$stdout
i$>
jest aliasami, więc ponowne przypisanie jednego wpłynie na drugie.IO#reopen
w przypadku$stdout
? Zupełnie nie zgadzam się z tą opinią.$stdout.reopen
Metoda mutuje jego odbiornik, a także wpływająSTDOUT
jeśli nie przypisane$stdout
wcześniej. Nie mają być synonimami, to nic złego, gdy mają różne wartości z powodu przypisania i otwierając ponownieSTDOUT
cel, który łamiesz.STDOUT
jest stałą globalną, więc nie należy jej zmieniać.$stdout
jest predefiniowaną zmienną, więc można ją zmienić.Jeśli używasz powłoki do przekierowywania:
wtedy nie ma znaczenia, który z nich zostanie użyty jako deskryptor pliku dla twojego skryptu, jest określany przed wykonaniem skryptu.
Jeśli jednak próbujesz zmienić deskryptor pliku dla STDOUT systemu operacyjnego z poziomu skryptu Ruby, na przykład, aby wysłać dane wyjściowe do obracającego się zestawu plików dziennika na podstawie bieżącego dnia tygodnia, upewnij się, że używasz
$stdout
.źródło
STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
Obie
$stdout
iSTDOUT
mają różne znaczenia. Dokumentacja Rubiego jest dość jasna na ten temat:Kiedy chcesz pisać na standardowe wyjście, masz na myśli bieżące standardowe wyjście, więc powinieneś pisać do
$stdout
.STDOUT
nie jest też bezużyteczna. Przechowuje domyślną wartość$stdout
. Jeśli kiedykolwiek zmienisz przypisanie$stdout
, możesz przywrócić poprzednią wartość za pomocą$stdout = STDOUT
.Ponadto istnieje jeszcze jedna wstępnie zdefiniowana zmienna:
Jednak wygląda na to, że w Rubim 2.3 po prostu zachowuje się jak alias dla
$stdout
. Ponowne przypisanie$stdout
zmienia wartość$>
i odwrotnie.źródło