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

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
m (Oprava vzhledu)
(Doplnění, opravy vzhledu)
Řádka 5: Řádka 5:
 
&nbsp;&nbsp;Write programs to work together.<br />
 
&nbsp;&nbsp;Write programs to work together.<br />
 
&nbsp;&nbsp;Write programs that handle text streams, because that is an universal interface.“<br />
 
&nbsp;&nbsp;Write programs that handle text streams, because that is an universal interface.“<br />
<div style="text-align: center">(McIlroy)</div>
+
<div style="text-align: center">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Douglas McIlroy</div>
 
</div>
 
</div>
  
== K čemu to je? (modelová situace) ==
+
 
* Zpracovávám fotku pomocí utilit v příkazovém řádku.
+
== K čemu je přesměrování vstupů? ==
* Filozofie Unixu:  
+
* 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:
* Tedy potřebuji:
+
** vzít fotku &rarr; doostřit &rarr; upravit kontrast &rarr; uložit výslednou fotku
** 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???
* Filozofie Unixu:
 
** programy by měly umět snadno komunikovat,
 
** dobrým prostředkem pro komunikaci jsou textové proudy.
 
  
== Poznámka ==
 
Vlastně se tedy jedná o způsob komunikace mezi procesy.
 
  
== Hrátky: program <tt>cat</tt> ==
+
== Procesy v Unixu a Linuxu ==
*ukončení vstupu: Ctrl+D
+
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.
  
== Pojmy ==
+
Viz také: [[Významné složky GNU/Linuxu]].
*filtr
+
*kolona
+
*roura (pipe)
+
  
== Roura jako způsob komunikace mezi procesy ==
 
; 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
 
  
 
== 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ů
**výstup do souboru i na obrazovku
+
 
  $ 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.
**filtruje duplicity
+
* <code>tr</code>.. (''TRanslate'')
*tr.. anslate
+
** Nahrazuje ve vstupu zadané znaky jinými (podle tabulky) a vypisuje na výstup.
 +
 
 +
 
 +
== Hrátky &mdash; 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 je to „filtr“ v kontextu povídání o Linuxu a příkazové řádce?
* na jaká zařízení jsou přesměrovány: standardní vstup, výstup a chybový výstup.
+
* Co znamenají pojmy: kolona, roura (pipe).
* jaký je rozdíl mezi |, >, 2> a >>?
+
* 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ů?


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:

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
ls -l > ~/obsah_adresare.txt
echo "Druhy adresar:" >> ~/obsah_adresare.txt
ls druhy -l >> ~/obsah_adresare.txt


Přesměrování chybového výstupu do souboru
cp a b 2> /dev/null
mv archiv.tar.gz zalohy 2> ~/zaloha_chyby.log


Přesměrování standardního vstupu


Propojení programů
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
Pomocné
cp ~/ahoj.txt /home/student/ahoj.txt 2> /dev/null

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.

tar --help | less
head -n 1 /proc/meminfo
tail /var/log/apache2/error_log
ls | wc -l
tar -c * | gzip > archiv.tar.gz
tar -czf archiv.tar.gz *
tar -xzf archiv.tar.gz
cat /etc/passwd | cut -d : -f 1,5 | sort
$ date | tee file1 file2   
Thu Jun 10 11:10:34 CEST 2004
$ cat file1   
Thu Jun 10 11:10:34 CEST 2004


Hrátky — filtr cat;)

cat
cat > /dev/stdout
cat > pokus.txt
cat /dev/stdin
cat < /etc/passwd


Zopakujte si


Vyzkoušejte si


Zdroje

Osobní nástroje
Jmenné prostory
Varianty
Akce
Výuka
Navigace
Nástroje