====== stderr (Standard Error) ====== **stderr** je standardní datový proud určený pro chybové zprávy. V systémech typu Unix a Windows má přiřazen deskriptor souboru (file descriptor) **2**. Ačkoliv se standardně zobrazuje na stejné obrazovce jako [[it_encyklopedie:stdout|stdout]], jedná se o technicky nezávislý kanál. ===== 1. Proč existuje stderr? ===== Představte si, že používáte [[it_encyklopedie:pipeline|pipeline]] ke zpracování dat: * ''cat data.txt | sort | uniq > vysledek.txt'' Pokud by během čtení souboru došlo k chybě (např. nedostatečná práva) a tato chyba by byla poslána do `stdout`, stala by se součástí vašich výsledných dat. Díky tomu, že chyba odteče přes **stderr**, uvidíte ji na obrazovce, ale vaše výsledná data v souboru ''vysledek.txt'' zůstanou "čistá". ===== 2. Manipulace se stderr v shellu ===== V příkazové řádce můžete se stderr pracovat pomocí čísla jeho deskriptoru (2): ==== Přesměrování chyb do souboru ==== Pokud chcete chyby uložit zvlášť a výsledky nechat na obrazovce: * ''prikaz 2> chyby.log'' ==== Úplné potlačení chyb ==== Často při skriptování nechceme, aby uživatel viděl varování, která nejsou kritická. Chyby pošleme do "černé díry" (**/dev/null**): * ''prikaz 2> /dev/null'' ==== Sloučení do jednoho proudu ==== Častý zápis pro uložení všeho (dat i chyb) do jednoho souboru: * ''prikaz > vse.log 2>&1'' (Znamená to: "Pošli proud 2 tam, kam právě teče proud 1.") ===== 3. Rozdíly mezi standardními proudy ===== ^ Proud ^ Jméno ^ Deskriptor ^ Cíl (Standardně) ^ | **stdin** | Standard Input | 0 | Klávesnice | | **stdout** | Standard Output | 1 | Terminál (Monitor) | | **stderr** | Standard Error | 2 | Terminál (Monitor) | ===== 4. Využití v programování ===== Programátoři by měli striktně rozlišovat, kam co vypisují: * **Python:** ''sys.stderr.write("Chyba!")'' (místo klasického ''print()'') * **C:** ''fprintf(stderr, "Chyba!");'' * **Java:** ''System.err.println("Chyba!");'' Při správném použití může monitorovací systém (např. v rámci [[it_encyklopedie:mlops|MLOps]]) automaticky zachytit pouze zprávy ze **stderr** a okamžitě poslat notifikaci správci, zatímco běžné logy ze **stdout** jen ukládá k pozdější analýze. ===== 5. Buffering (Vyrovnávací paměť) ===== Důležitý rozdíl mezi `stdout` a `stderr` je v tom, jak se data vypisují: * **stdout** je často //buffered// (data se hromadí a vypíšou se až po naplnění určité kapacity nebo ukončení řádku), aby se šetřil výkon. * **stderr** je obvykle //unbuffered// (data se vypisují okamžitě). Je to proto, aby v případě pádu programu byla chybová hláška vidět hned a nezůstala viset v paměti. > **Zajímavost:** Pokud v Linuxu napíšete příkaz, který neexistuje, chybová zpráva "-bash: xyz: command not found" pochází právě ze **stderr**. [[it_encyklopedie:linux_rozcestnik|Zpět na Linux]]