BASH: Kolony: Porovnání verzí
(Doplnění) |
m (→Popis funkce: fix) |
||
Řádka 4: | Řádka 4: | ||
Kolonu vytváří shell, a proto jsou vytvářeny v jednom shellu stejně bez závislosti na použitých programech. Většina programů určených pro práci v příkazovém řádku je v unixových systémech naprogramována tak, aby mohly být použity v kolonách. Do kolon lze spojovat i grafické programy, avšak ty používají typicky jako standardní výstup okno, jehož obsah nelze přesměrovávat na vstup dalšího programu. | Kolonu vytváří shell, a proto jsou vytvářeny v jednom shellu stejně bez závislosti na použitých programech. Většina programů určených pro práci v příkazovém řádku je v unixových systémech naprogramována tak, aby mohly být použity v kolonách. Do kolon lze spojovat i grafické programy, avšak ty používají typicky jako standardní výstup okno, jehož obsah nelze přesměrovávat na vstup dalšího programu. | ||
− | Kolona propojuje standardní výstup příkazu se standardním vstupem následujícího příkazu. Mezi programy je operačním systémem vytvořena vyrovnávací paměť (kruhový buffer), jejíž velikost je předem určena (např. 4 kiB). Pokud zapisující program vyrovnávací paměť zaplní, je další zápis pozastaven (program se na něm zastaví) až do chvíle, dokud z vyrovnávací paměti druhý proces nějaká data nepřečte. Stejně tak je čtení druhého programu zablokováno až do té doby, dokud do vyrovnávací paměti nejsou prvním procesem nějaká data zapsána. Pokud nějaký program v koloně skončí, je ostatním programům rozeslán signál SIGPIPE, který obvykle způsobí ukončení ostatních programů z důvodu | + | Kolona propojuje standardní výstup příkazu se standardním vstupem následujícího příkazu. Mezi programy je operačním systémem vytvořena vyrovnávací paměť (kruhový buffer), jejíž velikost je předem určena (např. 4 kiB). Pokud zapisující program vyrovnávací paměť zaplní, je další zápis pozastaven (program se na něm zastaví) až do chvíle, dokud z vyrovnávací paměti druhý proces nějaká data nepřečte. Stejně tak je čtení druhého programu zablokováno až do té doby, dokud do vyrovnávací paměti nejsou prvním procesem nějaká data zapsána. Pokud nějaký program v koloně skončí, je ostatním programům rozeslán signál SIGPIPE, který obvykle způsobí ukončení ostatních programů z důvodu přerušení roury (''broken pipe''). |
Uživatel kolonu vytváří obvykle postupně tak, že úkol rozdělí na menší úseky a ty postupně řeší a zároveň tak prodlužuje kolonu příkazů, která je ke zpracování dat určena. | Uživatel kolonu vytváří obvykle postupně tak, že úkol rozdělí na menší úseky a ty postupně řeší a zároveň tak prodlužuje kolonu příkazů, která je ke zpracování dat určena. |
Aktuální verze z 26. 4. 2016, 17:40
Kolona v shellu BASH (roura, pipe) umožňuje propojit vstupy a výstupy jednoduchých programů a provést tak najednou složitější operaci. Kolony jsou charakteristickým a velmi silným nástrojem unixových systémů, kde umožňuje snadno propojit funkce jednoduchých jednoúčelových programů do většího celku. Tuto vlastnost programátoři velmi často využívají. Kolony se často kombinují s přesměrováním a lze pomocí nich propojit prakticky libovolný počet programů.
Obsah
Popis funkce
Kolonu vytváří shell, a proto jsou vytvářeny v jednom shellu stejně bez závislosti na použitých programech. Většina programů určených pro práci v příkazovém řádku je v unixových systémech naprogramována tak, aby mohly být použity v kolonách. Do kolon lze spojovat i grafické programy, avšak ty používají typicky jako standardní výstup okno, jehož obsah nelze přesměrovávat na vstup dalšího programu.
Kolona propojuje standardní výstup příkazu se standardním vstupem následujícího příkazu. Mezi programy je operačním systémem vytvořena vyrovnávací paměť (kruhový buffer), jejíž velikost je předem určena (např. 4 kiB). Pokud zapisující program vyrovnávací paměť zaplní, je další zápis pozastaven (program se na něm zastaví) až do chvíle, dokud z vyrovnávací paměti druhý proces nějaká data nepřečte. Stejně tak je čtení druhého programu zablokováno až do té doby, dokud do vyrovnávací paměti nejsou prvním procesem nějaká data zapsána. Pokud nějaký program v koloně skončí, je ostatním programům rozeslán signál SIGPIPE, který obvykle způsobí ukončení ostatních programů z důvodu přerušení roury (broken pipe).
Uživatel kolonu vytváří obvykle postupně tak, že úkol rozdělí na menší úseky a ty postupně řeší a zároveň tak prodlužuje kolonu příkazů, která je ke zpracování dat určena.
Filtry
Filtry jsou programy, které jsou naprogramovány tak, že zpracovávají svůj standardní vstup a výsledek tisknou na standardní výstup. Díky tomu mohou být snadno spojovány do kolon. Většina základních unixových nástrojů je naprogramována jako filtry, avšak zároveň tak, že v případě poskytnutí parametru nečtou ze standardního vstupu, ale ze souboru, který je dán tímto parametrem.
Vytvoření roury v shellu BASH
Konstrukce Funkce příkaz1 | příkaz2
Propojení standardního výstupu programu příkaz1
do standardního vstupu programupříkaz2
příkaz1 2>&1 | příkaz2
Nasměrování spojeného standardního výstupu a standardního chybového výstupu programu příkaz1
do standardního vstupu programupříkaz2
Příklady
Činnost níže uvedených příkladů zkoumejte tak, že nejprve provedete první příkaz (včetně jeho parametrů až ke znaku roury) a pak postupně přidávejte další. Sledujte, jak se výstup mění a zjistěte proč.
Vypište ze souboru /etc/passwd
všechny řádky, které obsahují řetězec rp a setřiďte je podle abecedy.
grep rp /etc/passwd | sort
Vypište všechna UID uvedených u účtů v souboru /etc/passwd
a setřiďte je podle velikosti.
cut -d: -f3 /etc/passwd | sort -n
Vypište všechny běžící procesy, které mají v názvu řetězec gdm.
ps xauOT | grep bash ps xauOT | grep '[b]ash'
Vypište počet přihlášení jednotlivých uživatelů a seřaďte ho.
last | cut -d\ -f1 | sort | uniq -c | sort -n
Očíslujte řádky ve výstup příkazu včetně řádků s chybovými hlášeními.
grep root: /etc/* 2>&1 | nl
Zpracujte velmi dlouhý seznam argumentů, který není schopen zpracovat shell pomocí žolíkových znaků.
ls /var/spool/mqueue/* | xargs grep -l SPAM
Chybné použití roury
Při používání rour se velmi často dělá chyba označovaná jako nadbytečný cat
(ale může se jednat i o jiný nadbytečný příkaz). Chyba je způsobena tím, že si uživatel neuvědomí, že filtr může mít i parametr a zpracovávat soubor přímo (viz výše). Použití nadbytečného příkazu nemá vliv na funkčnost, ale je obvykle považováno za chybu, protože je zbytečně spuštěn další příkaz (plýtvání systémovými prostředky) a data musí procházet rourou (což provedení příkazů zpomaluje).
Ukázka chybně použitých konstrukcí:
cat /etc/passwd | sort # správně: sort /etc/passwd cat /etc/passwd | grep root # správně: grep root /etc/passwd cat /etc/passwd | nl # správně: cat -n /etc/passwd nebo: nl /etc/passwd ls /bin | grep sh # správně: ls /bin/*sh*