Vstup a výstup procesů, přesměrování
Z MiS
				
				
				(Rozdíly mezi verzemi)
				
																
				
				
								
				| m (Oprava vzhledu) |  (Doplnění, opravy vzhledu) | ||
| Řádka 5: | Řádka 5: | ||
|   Write programs to work together.<br /> |   Write programs to work together.<br /> | ||
|   Write programs that handle text streams, because that is an universal interface.“<br /> |   Write programs that handle text streams, because that is an universal interface.“<br /> | ||
| − | <div style="text-align: center"> | + | <div style="text-align: center">       Douglas McIlroy</div> | 
| </div> | </div> | ||
| − | == K čemu  | + | |
| − | *  | + | == K čemu je přesměrování vstupů? == | 
| − | *  | + | * Modelová situace: zpracovávám fotku pomocí utilit v příkazovém řádku. | 
| − | ** předepisuje jednoduché programy, které dělají jednu věc a dělají ji dobře. | + | * Potřebuji: | 
| − | *  | + | ** vzít fotku → doostřit → upravit kontrast → uložit výslednou fotku | 
| − | + | * [[Charakteristika Unixu|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??? | * 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í <tt>/dev/stdin</tt>, tedy klávesnice. | ||
| + | * standardním výstupem... za normálních okolností <tt>/dev/stdout</tt>, tedy obrazovka. | ||
| + | * standardním chybovým výstupem... za normálních okolností <tt>/dev/stderr</tt>, tedy obrazovka. | ||
| + | |||
| + | Vstup a výstup programů pak můžeme navzájem propojit. | ||
| + | |||
| == Varianty přesměrování == | == Varianty přesměrování == | ||
| Řádka 38: | Řádka 41: | ||
|   echo "Druhy adresar:" >> ~/obsah_adresare.txt |   echo "Druhy adresar:" >> ~/obsah_adresare.txt | ||
|   ls druhy -l >> ~/obsah_adresare.txt |   ls druhy -l >> ~/obsah_adresare.txt | ||
| + | |||
| ; Přesměrování chybového výstupu do souboru | ; Přesměrování chybového výstupu do souboru | ||
| Řádka 44: | Řádka 48: | ||
|   cp a b 2> /dev/null |   cp a b 2> /dev/null | ||
|   mv archiv.tar.gz zalohy 2> ~/zaloha_chyby.log |   mv archiv.tar.gz zalohy 2> ~/zaloha_chyby.log | ||
| + | |||
| ; Přesměrování standardního vstupu | ; Přesměrování standardního vstupu | ||
| * <tt>program '''<''' soubor</tt> | * <tt>program '''<''' soubor</tt> | ||
| *: <tt>program</tt> čte data ze souboru <tt>soubor</tt> místo ze standardního vstupu (z klávesnice). | *: <tt>program</tt> čte data ze souboru <tt>soubor</tt> místo ze standardního vstupu (z klávesnice). | ||
| + | |||
| ; Propojení programů | ; Propojení programů | ||
| * <tt>program1 '''|''' program2</tt> | * <tt>program1 '''|''' program2</tt> | ||
| − | *: Roura (anglicky pipe). Slouží k propojení dvou procesů. | + | *: Roura (anglicky pipe). Slouží k propojení dvou procesů. Je to tedy vlastně nástroj pro komunikaci mezi procesy. | 
| *: Spustí se <tt>program2</tt>. Jako vstup dostane „konec roury“ (anglicky pipe). Pak se spustí program <tt>program1</tt>. Výstup z programu <tt>program1</tt> se posílá do „roury“ a <tt>program2</tt> ho dále zpracovává. | *: Spustí se <tt>program2</tt>. Jako vstup dostane „konec roury“ (anglicky pipe). Pak se spustí program <tt>program1</tt>. Výstup z programu <tt>program1</tt> se posílá do „roury“ a <tt>program2</tt> ho dále zpracovává. | ||
|   ls | sort | head |   ls | sort | head | ||
|   cat /etc/passwd | cut -d : -f 1 | sort |   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 == | == Speciální soubory == | ||
| Řádka 65: | Řádka 80: | ||
|   cp ~/ahoj.txt /home/student/ahoj.txt 2> /dev/null |   cp ~/ahoj.txt /home/student/ahoj.txt 2> /dev/null | ||
| * <tt>/dev/zero</tt>... kdykoli budeme číst z tohoto souboru, dostaneme znak s ASCII kódem 0. Můžeme číst libovolně dlouho. | * <tt>/dev/zero</tt>... kdykoli budeme číst z tohoto souboru, dostaneme znak s ASCII kódem 0. Můžeme číst libovolně dlouho. | ||
| + | * <tt>/dev/random</tt>... kdykoli budeme číst z tohoto souboru, dostaneme náhodný byte. Můžeme číst libovolně dlouho. | ||
| − | + | Viz také: [[Významné složky GNU/Linuxu]]. | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| == Filtry == | == Filtry == | ||
| − | *cat | + | 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. | 
| − | *grep | + | |
| − | *less | + | * <code>cat</code>... čte vstup a opisuje data na výstup | 
| + | * <code>grep</code>... čte vstup a opisuje na výstup jen řádky obsahující parametr. | ||
| + | * <code>less</code>... stránkování výstupu, ukončujeme stiskem „q“ | ||
|   tar --help | less |   tar --help | less | ||
| − | *head | + | * <code>head</code>... opíše na výstup jen prvních několik řádek vstupu | 
| − | *tail | + |  head -n 1 /proc/meminfo | 
| + | * <code>tail</code>... opíše na výstup jen posledních několik řádek vstupu | ||
|   tail /var/log/apache2/error_log |   tail /var/log/apache2/error_log | ||
| − | *wc -l | + | * <code>wc -l</code>... spočte počet řádek vstupu | 
|   ls | wc -l |   ls | wc -l | ||
| − | *tar, gzip | + | * <code>tar</code>, <code>gzip</code> | 
| + | ** <code>tar</code> bere vstupní soubory, spojí je do jednoho proudu a vypíše na výstup. | ||
| + | ** <code>gzip</code> komprimuje/dekomprimuje soubory (metoda GZIP). | ||
|   tar -c * | gzip > archiv.tar.gz |   tar -c * | gzip > archiv.tar.gz | ||
|   tar -czf archiv.tar.gz * |   tar -czf archiv.tar.gz * | ||
|   tar -xzf archiv.tar.gz |   tar -xzf archiv.tar.gz | ||
| − | *unzip | + | * <code>unzip</code>... dekomprimuje data ze vstupu (metoda ZIP) | 
| − | *sort | + | * <code>sort</code> | 
|   cat /etc/passwd | cut -d : -f 1,5 | sort |   cat /etc/passwd | cut -d : -f 1,5 | sort | ||
| − | *cut | + | * <code>cut</code> | 
| − | *tee | + | * <code>tee</code>... opisuje vstup na obrazovku i do souboru či do dvou souborů | 
| − | + | ||
|   $ date | tee file1 file2     |   $ date | tee file1 file2     | ||
|   Thu Jun 10 11:10:34 CEST 2004 |   Thu Jun 10 11:10:34 CEST 2004 | ||
|   $ cat file1     |   $ cat file1     | ||
|   Thu Jun 10 11:10:34 CEST 2004 |   Thu Jun 10 11:10:34 CEST 2004 | ||
| − | *unique | + | * <code>unique</code>... filtruje duplicitní řádky ze vstupu. | 
| − | ** | + | * <code>tr</code>.. (''TRanslate'') | 
| − | * | + | ** Nahrazuje ve vstupu zadané znaky jinými (podle tabulky) a vypisuje na výstup. | 
| + | |||
| + | |||
| + | == Hrátky — filtr <tt>cat</tt>;) == | ||
| + | |||
| + | * Program <code>cat</code> 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í: <tt>Ctrl+D</tt> ;) | ||
| + |  cat > /dev/stdout | ||
| + |  cat > pokus.txt | ||
| + |  cat /dev/stdin | ||
| + |  cat < /etc/passwd | ||
| + | |||
| == Zopakujte si == | == 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 == | == Vyzkoušejte si == | ||
| Řádka 119: | Řádka 146: | ||
| * Zobrazte seznam souborů v adresáři <tt>/bin</tt>. 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). | * Zobrazte seznam souborů v adresáři <tt>/bin</tt>. 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. | * Vypište uživatelská jména uživatelů registrovaných v systému s GNU/Linuxem. Každé jméno na jeden řádek. | ||
| + | |||
| == Zdroje == | == Zdroje == | ||
| * [http://www.codecoffee.com/tipsforlinux/articles2/042.html codecoffee.com > Tips for Linux > Input/Output Redirection in Unix] | * [http://www.codecoffee.com/tipsforlinux/articles2/042.html codecoffee.com > Tips for Linux > Input/Output Redirection in Unix] | ||
Verze z 8. 1. 2014, 14:13
„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-  tarbere vstupní soubory, spojí je do jednoho proudu a vypíše na výstup.
-  gzipkomprimuje/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 catvlastně 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.
