BASH: Žolíkové znaky: Porovnání verzí

Z Milan Kerslager
Přejít na: navigace, hledání
(Kolona: doplnění)
m (Příklady: fix)
Řádka 26: Řádka 26:
 
=== Příklady ===
 
=== Příklady ===
 
  ls /bin/*sh          # vypíše z adresáře ''/bin'' vše, co končí na ''sh''  
 
  ls /bin/*sh          # vypíše z adresáře ''/bin'' vše, co končí na ''sh''  
ls *{txt,doc}        # vypíše v aktuálním adresáři vše končící na ''.txt'' nebo ''.doc''
 
 
  ls /bin/[bcd]*        # vypíše z adresáře ''/bin'' vše začínající na ''b'', ''c'' nebo ''d''
 
  ls /bin/[bcd]*        # vypíše z adresáře ''/bin'' vše začínající na ''b'', ''c'' nebo ''d''
 
  ls -d /etc/[ab]*      # vypíše z adresáře ''/etc'' vše začínající na ''a'' nebo ''b''
 
  ls -d /etc/[ab]*      # vypíše z adresáře ''/etc'' vše začínající na ''a'' nebo ''b''
 
  ls /bin/[^abc]*      # vypíše z adresáře ''/bin'' vše, co nezačíná na ''a'', ''b'' nebo ''c''
 
  ls /bin/[^abc]*      # vypíše z adresáře ''/bin'' vše, co nezačíná na ''a'', ''b'' nebo ''c''
 +
ls *{txt,doc}        # vypíše v aktuálním adresáři vše končící na ''.txt'' nebo ''.doc''
 
  ls /{bin,sbin}/c*    # vypíše z adresářů ''/bin'' a ''/sbin'' vše, co začíná na ''c''
 
  ls /{bin,sbin}/c*    # vypíše z adresářů ''/bin'' a ''/sbin'' vše, co začíná na ''c''
 
  ls /{,s}bin/c*        # vypíše z adresářů ''/bin'' a ''/sbin'' vše, co začíná na ''c''
 
  ls /{,s}bin/c*        # vypíše z adresářů ''/bin'' a ''/sbin'' vše, co začíná na ''c''

Verze z 20. 10. 2009, 12:56

Žolíkové znaky, přesměrování a kolony jsou základním nástrojem, pomocí kterého se z příkazového řádku stává mocný a výkonný nástroj. Základní příkazy Unixu je možné používat flexibilně, kombinovat jejich schopnosti a spojovat jejich schopnosti do větších celků.

Žolíkové znaky

Žolíkové znaky slouží k tomu, aby nebylo nutné uvádět všechny parametry příkazy explicitně, ale bylo možné použít obecné zadání. Lze například pracovat se všemi soubory s příponou txt nebo se všemi, které vyhovují jiným podmínkám (začínají na určité znaky, obsahují slovo atd.).

Konstrukce Funkce
* Jakékoliv znaky (i žádný znak)
? Jakýkoliv právě jeden znak
[abc] Jeden z uvedených znaků (zde a, b nebo c)
[^abc] Žádný z uvedených znaků (cokoliv kromě a, b nebo c)
 {slovo1,slovo2}  Jedno z uvedených slov (zde slovo1 nebo slovo2)

Příklady

ls /bin/*sh           # vypíše z adresáře /bin vše, co končí na sh 
ls /bin/[bcd]*        # vypíše z adresáře /bin vše začínající na b, c nebo d
ls -d /etc/[ab]*      # vypíše z adresáře /etc vše začínající na a nebo b
ls /bin/[^abc]*       # vypíše z adresáře /bin vše, co nezačíná na a, b nebo c
ls *{txt,doc}         # vypíše v aktuálním adresáři vše končící na .txt nebo .doc
ls /{bin,sbin}/c*     # vypíše z adresářů /bin a /sbin vše, co začíná na c
ls /{,s}bin/c*        # vypíše z adresářů /bin a /sbin vše, co začíná na c

Přesměrování

Konstrukce Funkce
> Přesměrování standardního výstupu (vytvoří nebo přemaže existující soubor)
>> Přesměrování standardního výstupu (vytvoří nebo přidá za konec existujícího souboru)
< Přesměrování standardního vstupu
2> Přesměrování do standardního chybového výstupu
2>&1 Spojení standardního chybového výstupu se standardním výstupem
1>&2 Spojení standardního výstupu se standardním chybovým výstupem (používá se při programování skriptů)
<<MARK Here document (používá se při programování skriptů)

Příklady

Při přesměrování standardního výstupu pomocí znaku > je existující soubor přepsán. Přesměrování pomocí >> přidává za konec existujícího souboru. V obou případech platí, že pokud soubor neexistuje, je vytvořen.

ls /bin > text.txt
echo kuk > text.txt
echo na strejdu >> text.txt

Většina programů považuje za svůj standardní vstup soubory, které jsou předány na příkazovém řádku jako parametry. Některé programy však toto vylepšení nemají implementováno a vždy předpokládají vstup na standardním vstupu. V následujícím příkladu je nejprve vytvořen soubor text.txt se dvěma řádky tak, že u příkazu echo je použit přepínač -e, který způsobí v tištěném řetězci interpretaci sekvence \n jako přechod na nový řádek. Následně je soubor text.txt převeden do formátu DOS/WINDOWS příkazem unix2dos a zaznamenán do souboru dos.txt.

/bin/echo -e "prvni\ndruhy" > text.txt
unix2dos < text.txt > dos.txt

Poznámka: Pomocí příkazu hexdump je možné provést inspekci obou souborů a zjistit, že v unixovém souboru text.txt je zaznamenán řídící znak LF (hexadecimálně 0x0A) a v převedeném souboru dos.txt je ve formátu DOS/WINDOWS používána sekvence CR/LF (0x0D, 0x0A). V příkladu je tučně zvýrazněn vstup od uživatele a znak $ (dolar) reprezentuje výzvu shellu (prompt):

$ hexdump -C text.txt
00000000  70 72 76 6e 69 0a 64 72  75 68 79 0a              |prvni.druhy.|
0000000c
$ hexdump -C dos.txt
00000000  70 72 76 6e 69 0d 0a 64  72 75 68 79 0d 0a        |prvni..druhy..|
0000000e

Při dávkovém použití mohou rušit chybová hlášení, které programy produkují. Proto se často chybový výstup přesměrovává do speciálního souboru /dev/null, který funguje zhruba jako bezedný odpadkový koš (vše, co se do něj zapíše, se ihned zahodí):

find /proc -name fd 2> /dev/null
grep root: /etc/* 2> /dev/null

Někdy je naopak potřeba uchovat výstup příkazu včetně chybových hlášení. Všimněte si, že při přesměrování do souboru je spojení standardního výstupu se standardním chybovým výstupem umístěno až za přesměrováním. Pokud by byl zápis proveden obráceně, nebude fungovat.

grep root: /etc/* > text.txt 2>&1

Při programování skriptů je někdy vhodné jednoduše přesměrovat standardní výstup příkazu na standardní chybový výstup:

echo POZOR: nemohu přečíst soubor XY 1>&2

Kolona

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

grep rp /etc/passwd | sort
cut -d: -f3 /etc/passwd | sort -n
last | cut -d\  -f1 | sort | uniq -c | sort -n