Vstup, výstup a přesměrování

Stránky: E-learning VŠCHT Praha
Kurz: Linux, shell
Kniha: Vstup, výstup a přesměrování
Vytiskl(a): Nepřihlášený host
Datum: pondělí, 7. října 2024, 03.18

1. Obecně o vstupu a výstupu

Programy shellu obvykle využívají tři speciální soubory systému, ze kterých přijímají nebo na ně vypisují data. Jedná se o standardní vstup (stdin), standardní výstup (stdout) a standardní chybový výstup (stderr). Všechny uvedené soubory je možné najít v systémovém adresáři /dev. Tyto soubory jsou přímo mapovány na zařízení, která jsou schopná data v daném směru zpracovat. Tedy standardní vstup je defaultně (rozuměj ve výchozím nastavení) mapovaný na klávesnici, standardní výstup a standardní chybový výstup jsou mapovány na obrazovku monitoru.

 


2. Standardní vstup

Implicitně (rozuměj zpravidla, tedy pokud není dáno jinak) se data do standardního vstupu zapisují pomocí klávesnice. To můžeme demonstrovat pomocí příkazu cat, který čte data ze standardního vstupu a zapisuje je do standardního výstupu (zobrazuje je na obrazovce monitoru). Spustíme-li příkaz cat, program vyzývá k zadání dat. Zapíšeme-li pomocí klávesnice libovolný text a stiskneme klávesu Enter, program přečte data ze standardního vstupu a následně vypíše na standardní výstup, tedy zadaný text znovu zobrazí na obrazovce monitoru. Příkaz cat nadále očekává další vstup. Zápis do standardního vstupu můžeme ukončit pomocí klávesové zkratky Ctrl + D.



Explicitně (rozuměj za definovaných podmínek) je možné vstup načíst z jiného zdroje, nejčastěji ze souboru (viz kapitolu Přesměrování).

3. Standardní výstup

Implicitně (rozuměj zpravidla, tedy pokud není dáno jinak) je standardním výstupem drtivé většiny programů shellu obrazovka monitoru. Výsledek zpracování dat zobrazují uživateli přímo na monitoru.



Explicitně (rozuměj za definovaných podmínek) je možné výstup přesměrovat na jiné zařízení nebo častěji do souboru (viz kapitolu Přesměrování).


4. Standardní chybový výstup

Standardní chybový výstup programy využívají k zápisu chybových hlášení a varování kvůli přehlednějšímu oddělení od standardního výstupu. Nicméně, stejně jako standardní výstup se i standardní chybový výstup zobrazuje na monitoru.

 


Standardní chybový výstup lze přesměrovat (viz kapitolu Přesměrování).


5. Přesměrování vstupu a výstupu

Standardní vstup, výstup a chybový výstup lze přesměrovat z defaultních (rozuměj výchozích) zařízení na jiné zdroje pomocí speciálních operátorů.

Chceme-li data načíst z jiného zdroje než je klávesnice, např. ze souboru, použijeme operátor "menší než" (<). Čtení dat ze souboru můžeme demonstrovat opět pomocí příkazu cat, ten načte obsah souboru a zobrazí na standardním výstupu.

 


Chceme-li data přesměrovat na jiný výstup než je monitor, např. do souboru, použijeme operátor "je větší" (>). Zápis dat do souboru můžeme demonstrovat pomocí příkazu date, ten nezobrazí výstup na monitoru, jak to obvykle dělá, ale přesměruje výstup do souboru. Pokud soubor s názvem uvedeným za operátorem neexistuje, automaticky se vytvoří.



Pozor na použití operátoru "je větší" (>). Tento typ přesměrování vždy vymaže a nahradí obsah souboru aktuálním výstupem.

 


Pokud bychom chtěli původní obsah souboru zachovat a aktuální výstup programu ke stávajícím datům v souboru přidat, použijeme operátor "dvojité je větší" (>>).



Uvedené operátory přesměrování lze v příkazové řádce shellu kombinovat. Zpracovávají se v pořadí, v jakém jsou uvedena.

 


Pokud nějakému programu předáme jako vstup data ze souboru (tedy prvním argumentem příkazu je jméno existujícího souboru), je operátor "je menší" (<) implicitní. V takových případech nemusíme operátor vůbec uvádět. Samotný operátor "je menší" (<) je okleštěnou verzí správného zápisu (0<), který přímo vyjadřuje pomocí číselné reprezentace, že se jedná o přesměrování standardního vstupu. Naposledy zmíněnou formu zápisu operátoru je možné také použít, ale všechna tři vyjádření jsou zcela ekvivalentní.



Obdobně je potřeba si uvědomit, že operátor "je větší" (>) přesmerovává pouze standardní výstup, nikoliv už standardní chybový výstup. Tedy operátor (>) je ekvivalentem ke správnému úplnému označení (1>). Naopak pokud bychom chtěli přesměrovat pouze standardní chybový výstup, musíme vždy využít jeho číselné reprezentace (2>). Oba výstupy lze tedy zpracovávat zcela odděleně.

 


Chceme-li přesměrovat standardní a standardní chybový výstup do jednoho souboru zároveň, můžeme využít operátor (&>). V takovém případě má vždy standardní chybový výstup přednost a vypíše se dříve před standardním výstupem.

 


Standardní chybový výstup můžeme také nechat přesměrovat do standardního výstupu pomocí operátoru (2>&1).

 


Pokud bychom přesměrovali standardní chybový výstup do standardního výstupu a zároveň chtěli standardní výstup přesměrovat do souboru, pak toto přesměrování musí být uvedeno přednostně.

 


6. Roura - pipe

Speciální typ přesměrování představuje operátor "roura" (|). Jeho název vychází z anglického slova pipe. Tento operátor umožňuje předat výstup jednoho programu jako vstup bezprostředně následujícímu programu.

 


Operátor lze použít vícenásobně. Výstupy jednotlivých programů v sekvenci příkazů spojených rourou se nezobrazují na obrazovku, protože jsou přesměrovávány jako vstup do následujícího programu. Teprve výstup posledního programu je přesměrován na standardní výstup.

 


Programům, které se tímto způsobem používají, se obvykle říká filtry, právě pro jejich funkci dílčího průběžného, nikoliv konečného, zpracování dat. Takto lze použít drtivou většinu běžných příkazů, jmenujme například sort, uniq, wc, head, tail, ale také grep, tr, sed, awk a další.

Za zmínku ještě stojí příkaz tee, který dokáže rozdělit standardní výstup a přesměrovat ho do souboru a jako vstup následujícímu programu zároveň.