Vstup / Výstup a PIPE
Velká síla Linuxu spočívá také v propojování vstupů a výstupů jednotlivých programů.
V interpretu příkazů jsou tři základní datové proudy.
stdin - vstupní proud (in) - většinou klávesnicestdout - výstupní proud (out) - většinou monitor
stderr - chybový proud (error)
Většina programů v Linuxu funguje tak, že čte vstupní data z klávesnice konzole a zapisuje výstup na obrazovku konzole. Chybové zprávy se zapíší do proudu stderr - ten je propojen s konzolí (obrazovkou).
Pro příklad:
ls > /home/radek/obsah - výstup programu ls se zapíše do souboru /home/radek/obsah (neexistuje-li, vytvoří se / existuje-li přepíše se)
| >soubor | Přesměruje výstup do souboru |
| >>soubor | Přesměruje výstup do souboru (výstup přidá na konec souboru - nepřepíše ho) |
| 2>soubor | Přesměruje chybový výstup do souboru |
| 2>>soubor | Přesměruje chybový výstup do souboru (výstup přidá na konec souboru) |
| &>soubor | Přesměruje výstup a chybový výstup do souboru |
< soubor |
Přesměruje vstup do zadaného souboru |
<< název |
Čte vstup až po slovo název. (Slovo název je jen příklad) |
| prvni | druhy | Výstup programu prvni se připojí na vstup programu druhy. (Toto se jmenuje PIPE neboli ROURA) |
Příklad použití PIPE:
cat dokument | more - cat vypíše obsah souboru dokument - výstup připojí na vstup programu more - to způsobí, že obsah souboru dokument budeme moci stránkovat :-)
Doplnění od Zdeňka H.
stdin/stdout:
Ve skutečnosti to není jen stdin, stdout, stderr - pokud si napíšete vlastní program, může zapisovat a přesměrovávat do dalších front.
Nicméně platí, e stdin|stdout|stderr jsou přiřazeny vždy.
A ještě bych doplnil pro začátečníky nejtěžší na pochopení: spojení přesměrování více front do jedné (např. stdout a stderr):
příkaz > /cesta/soubor 2>&1
čili přesměrujete standardní do souboru a chybový do standardního
BTW, v souvislosti s tím ještě zmíním příkaz tee (rozdvojka na frontu)
příkaz | tee /cesta/soubor | less
čili stand. výstup se zobrazí na obrazovce a ještě se uloží do souboru
Velmi užitečné je rovněž vytvoření a použití pojmenované roury:
mkfifo /tmp/xxxpříkaz > /tmp/xxx
cat /tmp/xxx
Dále se poměrně často hodí průběžné sledování výstupu nějakého příkazu utilitou watch
watch [-n <sekund>] 'příkaz'
Dále poznamenám, že např. přesměrování, kdy stdout (resp. stdin) ze stroje A předhodíme na stdin (resp. stdout) jinému příkazu na stroji B, vůbec nemusejí dopadnout dobře, protože pokud verze příkazu na obou strojích používají různé velikosti bloku (např. tar, dd etc.), budou se v některých implementacích těchto příkazů doplňovat neúplné bloky pomocí prázdných byte, což se může projevit velmi zákeřnými chybami. V takovém případě důsledně ověřovat CRC (cksum, md5sum), nebo zjistit a důsledně použít stejnou velikost bloku, nebo použít upravené příkazy (star, sdd - http://www.fokus.gmd.de/research/cc/glone/employees/joerg.schilling/private/index.html ) Velmi důležité pro uživatele může být i užitečné default chování terminalu - stiskem CTRL+S[Q][C][resp Z] pozastaví|obnoví|preruší|upozadi výstup na terminál (resp. proces). Než ukončím terminál jen proto, že se "nějak zasekl", není na škodu stisknout pro jistotu CTRL+Q s tím souvisí také nastavení terminálu - man stty





















