stdout

Standardowe wyjście, deskryptor pliku numer 1, domyślny cel zwykłych komunikatów programu. Można je przekierować do pliku lub potoku.

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 — wynik ls trafia 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).