Różnica między $stdout i STDOUT w Ruby
W Rubim, jaka jest różnica pomiędzy $stdout
(poprzedzona znakiem dolara) i STDOUT
(wielkimi literami)? Podczas wykonywania przekierowania wyjścia, co powinno być używane i dlaczego? To samo dotyczy $stderr
i STDERR
.
Edit: właśnie znalazłem podobne pytanie.
3 answers
$stdout
jest zmienną globalną , która reprezentuje bieżące standardowe wyjście. STDOUT
jest stałą reprezentującą standardowe wyjście i jest zazwyczaj domyślną wartością $stdout
.
Ponieważ STDOUT
jest stałą, nie powinieneś jej definiować ponownie, możesz jednak zdefiniować ponownie $stdout
bez błędów / ostrzeżeń (ponowne zdefiniowanie STDOUT
wywoła Ostrzeżenie). na przykład, można zrobić:
$stdout = STDERR
To samo dotyczy $stderr
i STDERR
Więc, aby odpowiedzieć na drugą część twojego pytanie, użyj zmiennych globalnych do przekierowania wyjścia, a nie stałych. Po prostu uważaj, aby zmienić go z powrotem w kodzie, ponowne zdefiniowanie zmiennych globalnych może mieć wpływ na inne części aplikacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-03 17:04:25
Zarówno $stdout
jak i STDOUT
mają różne znaczenia. dokumentacja Rubiego jest dość jasna w tym temacie:
- {–0]} - aktualne standardowe wyjście.
- {–1]} - standardowe wyjście. Domyślna wartość $stdout.
Jeśli chcesz zapisać na standardowe wyjście, masz na myśli bieżące standardowe wyjście, więc powinieneś napisać do $stdout
.
STDOUT
nie jest też bezużyteczny. Przechowuje domyślną wartość dla $stdout
. Jeśli kiedykolwiek zmienisz $stdout
, możesz przywrócić poprzednią wartość za pomocą $stdout = STDOUT
.
Ponadto istnieje jeszcze jedna predefiniowana zmienna:
- {[9] – - domyślne wyjście dla print, printf, które domyślnie jest
$stdout
.
Wygląda jednak na to, że w Rubim 2.3 zachowuje się po prostu jak alias dla $stdout
. Ponowne przypisanie $stdout
zmienia wartość $>
i odwrotnie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-03 17:09:13
-
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 przekierowania:
$ ruby test.rb > test.log
Wtedy nie ma znaczenia, którego deskryptora pliku używasz, zanim skrypt zostanie wykonany.
Jednakże, jeśli próbujesz zmienić deskryptor pliku dla STDOUT systemu operacyjnego z poziomu skryptu Ruby, na przykład, aby wysłać wyjście do obracającego się zestawu plików dziennika na podstawie bieżącego dnia tygodnia, musisz upewnić się, że używasz $stdout
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-03 17:06:57