stdin

Standardowe wejście, deskryptor pliku numer 0, domyślne źródło danych wejściowych programu. Zwykle klawiatura, ale często przekierowywane z pliku lub potoku.

stdin (od standard input, czyli standardowe wejście) to domyślny kanał, którym program dostaje dane do przetworzenia. W systemach uniksowych kryje się pod deskryptorem pliku numer 0 — jednym z trzech standardowych strumieni obok stdout (1) i stderr (2). Domyślnie podpięty jest pod klawiaturę terminala, ale jego prawdziwa moc polega na tym, że możesz to źródło podmienić: na plik, na wyjście innego programu albo na strumień z sieci.

Jak to działa

Kiedy program czyta „z wejścia”, tak naprawdę czyta z deskryptora 0 — nie obchodzi go, co jest po drugiej stronie. To powłoka (np. bash) decyduje, co tam podstawić. Uruchamiasz program w terminalu bez żadnych sztuczek? Wpisujesz dane ręcznie, a koniec sygnalizujesz znakiem EOF — w Linuksie i macOS to Ctrl+D (w Windows Ctrl+Z i Enter). Dzięki temu modelowi powstała cała filozofia Uniksa: małe narzędzia, które czytają ze stdin i piszą na stdout, można składać w łańcuchy potoków (pipe).

To właśnie dlatego potoki działają tak gładko. Operator | podpina stdout jednego procesu do stdin następnego, a operator < przekierowuje wejście z pliku.

Przykład z praktyki

Klasyka — policzenie linii w pliku bez podawania jego nazwy narzędziu wc:

  • wc -l < access.log — powłoka otwiera plik i podstawia go jako stdin,
  • cat access.log | grep "404" | wc -l — dane płyną przez potok, każde narzędzie czyta ze stdin poprzednika,
  • sort < nazwy.txtsort sortuje to, co dostanie na wejściu.

W Pythonie sięgniesz po sys.stdin, a pętla for line in sys.stdin: przetwarza dane linia po linii, niezależnie czy lecą z klawiatury, czy z potoku.

Częste błędy i mity

„Program się zawiesił." Często nie jest zawieszony — po prostu czeka na stdin, bo nie podałeś danych ani EOF. Wciśnij Ctrl+D. Druga pułapka: mylenie < (przekierowanie wejścia) z argumentem. grep wzorzec plik.txt czyta plik jako argument, a grep wzorzec < plik.txt czyta go ze stdin — to dwie różne ścieżki w kodzie narzędzia. I pamiętaj: stdin da się odczytać tylko raz; gdy strumień się wyczerpie, drugi raz już z niego nie poczytasz.

Pojęcia powiązane: stdout, stderr, deskryptor pliku, pipe (potok), przekierowanie, EOF, here-document, tty.