Obsah
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 stdout, jedná se o technicky nezávislý kanál.
1. Proč existuje stderr?
Představte si, že používáte 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éhoprint()) - 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 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.
