BASH: Kolony: Porovnání verzí

Z Milan Kerslager
Přejít na: navigace, hledání
(Doplnění)
m (Popis funkce: fix)
 
(Nejsou zobrazeny 2 mezilehlé verze od stejného uživatele.)
Řádka 1: Řádka 1:
'''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ů. Kombinují se často s [[BASH: Přesměrování|přesměrováním]].
+
'''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 [[BASH: Přesměrování|přesměrováním]] a lze pomocí nich propojit prakticky libovolný počet programů.
 +
 
 +
== 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 ==
 
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.
 
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.
  
== Vytváření roury ==
+
== Vytvoření roury v shellu BASH ==
 
:{| class=wikitable
 
:{| class=wikitable
 
! Konstrukce
 
! Konstrukce
Řádka 18: Řádka 25:
 
== Příklady ==
 
== 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č.
 
Č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 <code>/etc/passwd</code> všechny řádky, které obsahují řetězec ''rp'' a setřiďte je podle abecedy.
  
 
  grep rp /etc/passwd | sort
 
  grep rp /etc/passwd | sort
 +
 +
Vypište všechna UID uvedených u účtů v souboru <code>/etc/passwd</code> a setřiďte je podle velikosti.
 +
 
  cut -d: -f3 /etc/passwd | sort -n
 
  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 bash
 
  ps xauOT | grep '[b]ash'
 
  ps xauOT | grep '[b]ash'
last | cut -d\  -f1 | sort
+
 
 +
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
 
  last | cut -d\  -f1 | sort | uniq -c | sort -n
grep root: /etc/* | nl
+
 
 +
Očíslujte řádky ve výstup příkazu včetně řádků s chybovými hlášeními.
 +
 
 
  grep root: /etc/* 2>&1 | nl
 
  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
 
  ls /var/spool/mqueue/* | xargs grep -l SPAM
  

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ů.

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 programu pří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 programu pří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*

Externí odkazy