====== stdin (Standard Input) ====== **stdin** je standardní komunikační kanál, přes který proces přijímá data. V technické dokumentaci a programování se mu přiřazuje tzv. deskriptor souboru (file descriptor) s hodnotou **0**. ===== 1. Zdroje vstupu pro stdin ===== V závislosti na tom, jak program spustíte, může být zdrojem pro stdin: * **Klávesnice:** Výchozí stav. Program čeká, až uživatel něco napíše a stiskne Enter. * **Soubor:** Pomocí přesměrování (znaku ''<'') lze obsahu souboru "vnutit" programu jako vstup. * **Jiný program:** Pomocí [[it_encyklopedie:pipeline|pipeline]] (znaku ''|'') se výstup jednoho programu stane standardním vstupem druhého. ===== 2. Tři pilíře standardních proudů ===== stdin nikdy nefunguje osamoceně, je součástí trojice proudů: ^ Proud ^ Název ^ Deskriptor ^ Účel ^ | **stdin** | Standard Input | 0 | Příjem dat (vstup). | | **stdout** | Standard Output | 1 | Výpis výsledků (výstup). | | **stderr** | Standard Error | 2 | Výpis chybových hlášení. | ===== 3. Přesměrování a Pipeline v praxi ===== ==== Přesměrování ze souboru (Redirection) ==== Místo psaní na klávesnici pošleme soubor do programu: * ''sort < seznam_jmen.txt'' Tímto způsobem program ''sort'' přečte obsah souboru přes svůj **stdin**, seřadí ho a vypíše na obrazovku. ==== Propojení programů (Pipelining) ==== Toto je základní kámen linuxové filozofie: * ''cat data.txt | grep "Praha"'' Zde výstup příkazu ''cat'' teče do **stdin** příkazu ''grep''. ===== 4. stdin v programování ===== Téměř každý programovací jazyk má zabudovanou cestu, jak číst ze stdin: * **Python:** ''input()'' nebo ''sys.stdin.read()'' * **C:** ''scanf()'' nebo ''fgets(stdin, ...)'' * **Java:** ''System.in'' Tato abstrakce je velmi mocná, protože programátor nemusí řešit, jestli data píše člověk na klávesnici, nebo jestli přicházejí z gigabajtového logovacího souboru přes rouru. ===== 5. Ukončení vstupu (EOF) ===== Když program čte ze stdin (např. v terminálu), potřebuje vědět, kdy data končí. K tomu slouží znak **EOF (End Of File)**. * V Linuxu/macOS se posílá zkratkou **Ctrl+D**. * Ve Windows se v příkazové řádce používá **Ctrl+Z**. > **Zajímavost:** Mnoho začátečníků se snaží v interaktivních programech zadat heslo přes stdin pomocí ''echo "heslo" | program''. To však může být nebezpečné, protože heslo zůstane v historii příkazů. Bezpečnější programy proto pro hesla často stdin obcházejí a čtou přímo z terminálu, aby zabránily nechtěnému přesměrování. [[it_encyklopedie:linux_rozcestnik|Zpět na Linux]]