stdout (z ang. standard output, czyli standardowe wyjście) to domyślny kanał, którym program wypycha swoje normalne komunikaty — wyniki obliczeń, raporty, to co echo czy print wyrzuca na ekran. W systemach uniksowych ma przypisany deskryptor pliku numer 1. Razem z stdin (0, wejście) i stderr (2, błędy) tworzy trójkę standardowych strumieni, które proces dostaje od systemu na starcie.
Jak to działa
Kiedy uruchamiasz program w terminalu, jego stdout jest domyślnie podpięty pod ekran. Ale tu jest cała magia Uniksa: to wyjście można przekierować. Program nie wie i nie obchodzi go, czy jego output ląduje na ekranie, w pliku, czy w innym procesie — po prostu pisze do deskryptora 1, a resztą zajmuje się powłoka. Dzięki temu te same narzędzia działają interaktywnie i w skryptach bez żadnych zmian.
Najważniejszy podział, który musisz zakodować w głowie: zwykłe wyniki idą na stdout, a komunikaty o błędach na stderr. To pozwala oddzielić ziarno od plew — zapisać poprawny wynik do pliku, a błędy zostawić na ekranie, gdzie je zobaczysz.
Przykład z praktyki
Przekierowanie stdout do pliku operatorem >:
ls -l > lista.txt— wyniklstrafia do pliku zamiast na ekran.echo "hej" >> log.txt—>>dopisuje na koniec, zamiast nadpisywać.cat dane.txt | grep error— potok|wpina stdout pierwszego programu w stdin drugiego.
Czasem chcesz mieć i błędy, i wynik w jednym miejscu: ./skrypt.sh > full.log 2>&1. Zapis 2>&1 mówi „przekieruj stderr (2) tam, gdzie aktualnie wskazuje stdout (1)”. Kolejność ma znaczenie, o czym za chwilę.
Częste błędy i pułapki
Pomylona kolejność 2>&1. Zapis 2>&1 > plik NIE działa tak, jak myślisz — najpierw kopiuje stderr na ekran (bo stdout jeszcze tam wskazuje), a dopiero potem przekierowuje stdout do pliku. Poprawnie jest > plik 2>&1.
Mylenie ekranu z plikiem. Jeśli skrypt nic nie zapisał do pliku, a „wszystko widać na ekranie”, to często znak, że narzędzie pisze na stderr, nie stdout — i twoje > go nie łapie.
Buforowanie. Gdy stdout idzie do potoku albo pliku, wiele programów buforuje wyjście blokowo i komunikaty pojawiają się z opóźnieniem. W realtime logach ratuje stdbuf albo flush po stronie aplikacji.
Pojęcia powiązane
stdin, stderr, deskryptor pliku, pipe (potok), redyrekcja, tee, /dev/null, powłoka (shell).