Vstup a výstup procesů, přesměrování
Z MiS
„Write programs that do one thing and do it well.
Write programs to work together.
Write programs that handle text streams, because that is an universal interface.“
Douglas McIlroy
Obsah |
K čemu je přesměrování vstupů?
- Modelová situace: zpracovávám fotku pomocí utilit v příkazovém řádku.
- Potřebuji:
- vzít fotku → doostřit → upravit kontrast → uložit výslednou fotku
- Filozofie Unixu předepisuje jednoduché programy, které dělají jednu věc a dělají ji dobře.
- Měl bych tedy mít pro každý úkol samostatný program.
- Abych nemusel pokaždé ukládat a znovu načítat, mohly by si programy výsledky předávat přímo???
Procesy v Unixu a Linuxu
Přesměrování vstupů je vlastně způsob komunikace mezi procesy. Proces si můžeme představit jako černou skříňku s:
- standardním vstupem... za normálních okolností /dev/stdin, tedy klávesnice.
- standardním výstupem... za normálních okolností /dev/stdout, tedy obrazovka.
- standardním chybovým výstupem... za normálních okolností /dev/stderr, tedy obrazovka.
Vstup a výstup programů pak můžeme navzájem propojit.
Varianty přesměrování
- Přesměrování standardního výstupu do souboru
- program > soubor
- Zápis výstupu programu do souboru.
- Spustíme program s názvem program (tedy vznikne proces).
- Výstup procesu budeme zapisovat do souboru soubor.
- Pokud soubor neexistuje, vytvoří se. Pokud soubor již existuje, nová data přepíší ta, která v něm byla.
ls -l > ~/obsah_adresare.txt
- program >> soubor
- Stejně jako předchozí, ale pokud soubor již existuje, nově zapisovaná data se připojí na konec souboru.
echo "Druhy adresar:" >> ~/obsah_adresare.txt ls druhy -l >> ~/obsah_adresare.txt
- Přesměrování chybového výstupu do souboru
- program 2> soubor
- Chyby, které vypisuje program program se zapisují do souboru soubor.
cp a b 2> /dev/null mv archiv.tar.gz zalohy 2> ~/zaloha_chyby.log
- Přesměrování standardního vstupu
- program < soubor
- program čte data ze souboru soubor místo ze standardního vstupu (z klávesnice).
- Propojení programů
- program1 | program2
- Roura (anglicky pipe). Slouží k propojení dvou procesů. Je to tedy vlastně nástroj pro komunikaci mezi procesy.
- Spustí se program2. Jako vstup dostane „konec roury“ (anglicky pipe). Pak se spustí program program1. Výstup z programu program1 se posílá do „roury“ a program2 ho dále zpracovává.
ls | sort | head cat /etc/passwd | cut -d : -f 1 | sort
- Další příklady
cat /proc/meminfo cat /proc/meminfo | head cat /proc/meminfo | head -n 1 > memory.txt cat /proc/meminfo | grep Free cat /etc/passwd | grep student
Speciální soubory
- Virtuální soubory reprezentující standardní vstup a výstup
- /dev/stdin... reprezentuje standardní vstup (klávesnici)
- /dev/stdout... reprezentuje standardní výstup (obrazovku)
- /dev/stderr... reprezentuje standardní chybový výstup (obrazovku)
- Pomocné
- /dev/null... jakákoli data zapsaná do tohoto souboru se zahodí
cp ~/ahoj.txt /home/student/ahoj.txt 2> /dev/null
- /dev/zero... kdykoli budeme číst z tohoto souboru, dostaneme znak s ASCII kódem 0. Můžeme číst libovolně dlouho.
- /dev/random... kdykoli budeme číst z tohoto souboru, dostaneme náhodný byte. Můžeme číst libovolně dlouho.
Viz také: Významné složky GNU/Linuxu.
Filtry
Jako filtr označujeme program, který čte data ze standardního vstupu a zapisuje výsledky na standardní výstup. Typické unixové programy se tedy chovají jako filtry.
-
cat
... čte vstup a opisuje data na výstup -
grep
... čte vstup a opisuje na výstup jen řádky obsahující parametr. -
less
... stránkování výstupu, ukončujeme stiskem „q“
tar --help | less
-
head
... opíše na výstup jen prvních několik řádek vstupu
head -n 1 /proc/meminfo
-
tail
... opíše na výstup jen posledních několik řádek vstupu
tail /var/log/apache2/error_log
-
wc -l
... spočte počet řádek vstupu
ls | wc -l
-
tar
,gzip
-
tar
bere vstupní soubory, spojí je do jednoho proudu a vypíše na výstup. -
gzip
komprimuje/dekomprimuje soubory (metoda GZIP).
-
tar -c * | gzip > archiv.tar.gz tar -czf archiv.tar.gz * tar -xzf archiv.tar.gz
-
unzip
... dekomprimuje data ze vstupu (metoda ZIP) -
sort
cat /etc/passwd | cut -d : -f 1,5 | sort
-
cut
-
tee
... opisuje vstup na obrazovku i do souboru či do dvou souborů
$ date | tee file1 file2 Thu Jun 10 11:10:34 CEST 2004 $ cat file1 Thu Jun 10 11:10:34 CEST 2004
-
unique
... filtruje duplicitní řádky ze vstupu. -
tr
.. (TRanslate)- Nahrazuje ve vstupu zadané znaky jinými (podle tabulky) a vypisuje na výstup.
Hrátky — filtr cat;)
- Program
cat
vlastně jen kopíruje data ze vstupu na výstup. - Pokud mu navíc zadáme jako parametr název souboru, čte data z tohoto souboru.
- Zamyslete se, co bude dělat, a vyzkoušejte:
cat
- Pozn.: ukončení vstupního souboru provedeme kombinací: Ctrl+D ;)
cat > /dev/stdout cat > pokus.txt cat /dev/stdin cat < /etc/passwd
Zopakujte si
- Co je to „filtr“ v kontextu povídání o Linuxu a příkazové řádce?
- Co znamenají pojmy: kolona, roura (pipe).
- Na jaká zařízení jsou přesměrovány: standardní vstup, výstup a chybový výstup?
- Jaký je rozdíl mezi |, >, 2> a >>?
Vyzkoušejte si
- Vypište obsah adresáře do souboru vypis.txt.
- Spočtěte, kolik souborů a složek je v adresáři.
- V předchozím úkolu zahrňte jen soubory obsahující písmeno w.
- Výsledek předchozího úkolu připojte na nový rádek do souboru vypis.txt.
- Zobrazte seznam souborů v adresáři /bin. Pokud se výpis nevleze na obrazovku, zařiďte, aby se vypsala jen první obrazovka a výpisem šlo listovat (nahoru, dolů, o celé stránky, vyhledávat).
- Vypište uživatelská jména uživatelů registrovaných v systému s GNU/Linuxem. Každé jméno na jeden řádek.