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

Z Milan Kerslager
Přejít na: navigace, hledání
(Přesměrování: doplnění)
(Doplnění)
 
(Není zobrazeno 9 mezilehlých verzí od stejného uživatele.)
Řádka 1: Řádka 1:
'''Žolíkové znaky, přesměrování a kolony''' jsou základním nástrojem, pomocí kterého se z [[Ovládání příkazového řádku v Unixu|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''' slouží k tomu, aby nebylo nutné uvádět všechny parametry příkazů explicitně, ale bylo možné použít obecné zadání. Lze například pracovat se všemi soubory s příponou <code>txt</code> nebo se všemi, které vyhovují jiným podmínkám (začínají na určité znaky, obsahují slovo atd.).
  
== Žolíkové znaky ==
+
== Zpracování žolíkových znaků ==
Ž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 <code>txt</code> nebo se všemi, které vyhovují jiným podmínkám (začínají na určité znaky, obsahují slovo atd.).
+
Žolíkové znaky, které jsou uvedeny na příkazovém řádku, zpracovává použitý ''shell''. Programu jsou předány již expandované parametry. Tímto způsobem je dosaženo jednotného zpracování parametrů pro spouštěné příkazy (na rozdíl od DOSu a Windows, kde si je zpracovává každý program sám a dochází tak k rozdílům a nejednotnostem).
 +
 
 +
== Význam přípony ve jméně souboru ==
 +
Jméno souboru nemá v unixových systémech strukturu a jádro operačního systému přípony nijak nevyužívá. Proto jsou přípony pouze věcí dohody, případně slouží pro uživatele jako vodítko, co je v daném souboru obsaženo. V grafických prostředích slouží přípony pro asociaci s aplikacemi. Z těchto důvodů se při použití žolíkových znaků pracuje s celým jménem (bez rozlišení přípony), což je zřejmý rozdíl od DOSu nebo Windows (kde přípona slouží k rozlišení spustitelných souborů, což způsobuje opakované bezpečnostní problémy).
  
 
:{| class=wikitable
 
:{| class=wikitable
Řádka 16: Řádka 19:
 
| align=center | <code>[abc]</code>
 
| align=center | <code>[abc]</code>
 
| Jeden z uvedených znaků (zde a, b nebo c)
 
| Jeden z uvedených znaků (zde a, b nebo c)
 +
|-
 +
| align=center | <code>[a-e]</code>
 +
| Jeden z rozsahu znaků (zde a až e), moderní shelly respektují národní znaky (locale)
 
|-
 
|-
 
| align=center | <code>[^abc]</code>
 
| align=center | <code>[^abc]</code>
| Žádný z uvedených znaků (cokoliv kromě a, b nebo c)
+
| Žádný z uvedených znaků (cokoliv kromě a, b nebo c), lze též využít rozsah
 
|-
 
|-
 
| align=center | &nbsp;<code>{slovo1,slovo2}</code>&nbsp;
 
| align=center | &nbsp;<code>{slovo1,slovo2}</code>&nbsp;
Řádka 24: Řádka 30:
 
|}
 
|}
  
=== 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 /bin/[a-d]*        # vypíše z adresáře ''/bin'' vše začínající na ''a'', ''b'', ''c'' nebo ''d''
 +
ls /bin/[a-zA-Z]      # vypíše z adresáře ''/bin'' vše začínající na písmeno
 +
  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''
 +
ls {,/usr}/bin/z*    # vypíše z adresářů /bin a /usr/bin vše, co začíná na písmeno ''z''
  
== Přesměrování ==
+
== Externí odkazy ==
:{| class=wikitable
+
* http://docs.linux.cz/programming/interpreted/bashdoc-1.4/bashs38.html
! Konstrukce
+
* http://www.abclinuxu.cz/blog/firefox_bal/2008/10/bash-a-pseudoznaky-pattern-matching
! Funkce
 
|-
 
| align=center | <code>&gt;</code>
 
| Přesměrování standardního výstupu (vytvoří nebo přemaže existující soubor)
 
|-
 
| align=center | <code>&gt;&gt;</code>
 
| Přesměrování standardního výstupu (vytvoří nebo přidá za konec existujícího souboru)
 
|-
 
| align=center | <code>&lt;</code>
 
| Přesměrování standardního vstupu
 
|-
 
| align=center | <code>2&gt;</code>
 
| Přesměrování do standardního chybového výstupu
 
|-
 
| align=center | <code>2&gt;&amp;1</code>
 
| Spojení standardního chybového výstupu se standardním výstupem
 
|-
 
| align=center | <code>1&gt;&amp;2</code>
 
| Spojení standardního výstupu se standardním chybovým výstupem (používá se při [[Programování v shellu BASH|programování skriptů]])
 
|-
 
| align=center | <code>&lt;&lt;MARK</code>
 
| Here document (používá se při [[Programování v shellu BASH|programování skriptů]])
 
|}
 
 
 
=== Příklady ===
 
Při přesměrování standardního výstupu pomocí znaku <code>&gt;</code> je existující soubor přepsán. Přesměrování pomocí <code>&gt;&gt;</code> 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 <code>text.txt</code> se dvěma řádky tak, že u příkazu <code>echo</code> je použit přepínač <code>-e</code>, který způsobí v tištěném řetězci interpretaci sekvence <code>\n</code> jako přechod na nový řádek. Následně je soubor <code>text.txt</code> převeden do formátu DOS/WINDOWS příkazem <code>unix2dos</code> a zaznamenán do souboru <code>dos.txt</code>.
 
 
 
/bin/echo -e "prvni\ndruhy" > text.txt
 
unix2dos < text.txt > dos.txt
 
 
 
''Poznámka:'' Pomocí příkazu <code>hexdump</code> je možné provést inspekci obou souborů a zjistit, že v unixovém souboru <code>text.txt</code> je zaznamenán řídící znak LF (hexadecimálně <code>0x0A</code>) a v převedeném souboru <code>dos.txt</code> je ve formátu DOS/WINDOWS používána sekvence CR/LF (<code>0x0D</code>, <code>0x0A</code>). 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 <code>/dev/null</code>, 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í v shellu BASH|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 ==
 
:{| class=wikitable
 
! Konstrukce
 
! Funkce
 
|-
 
| align=center | <code>|</code>
 
| Vytvoření roury
 
|}
 
  
=== Příklady ===
+
[[Kategorie:Práce s Linuxem]]

Aktuální verze z 25. 11. 2009, 16:51

Žolíkové znaky slouží k tomu, aby nebylo nutné uvádět všechny parametry příkazů 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.).

Zpracování žolíkových znaků

Žolíkové znaky, které jsou uvedeny na příkazovém řádku, zpracovává použitý shell. Programu jsou předány již expandované parametry. Tímto způsobem je dosaženo jednotného zpracování parametrů pro spouštěné příkazy (na rozdíl od DOSu a Windows, kde si je zpracovává každý program sám a dochází tak k rozdílům a nejednotnostem).

Význam přípony ve jméně souboru

Jméno souboru nemá v unixových systémech strukturu a jádro operačního systému přípony nijak nevyužívá. Proto jsou přípony pouze věcí dohody, případně slouží pro uživatele jako vodítko, co je v daném souboru obsaženo. V grafických prostředích slouží přípony pro asociaci s aplikacemi. Z těchto důvodů se při použití žolíkových znaků pracuje s celým jménem (bez rozlišení přípony), což je zřejmý rozdíl od DOSu nebo Windows (kde přípona slouží k rozlišení spustitelných souborů, což způsobuje opakované bezpečnostní problémy).

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)
[a-e] Jeden z rozsahu znaků (zde a až e), moderní shelly respektují národní znaky (locale)
[^abc] Žádný z uvedených znaků (cokoliv kromě a, b nebo c), lze též využít rozsah
 {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 /bin/[a-d]*        # vypíše z adresáře /bin vše začínající na a, b, c nebo d
ls /bin/[a-zA-Z]      # vypíše z adresáře /bin vše začínající na písmeno
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
ls {,/usr}/bin/z*     # vypíše z adresářů /bin a /usr/bin vše, co začíná na písmeno z

Externí odkazy