Glob
Globy jsou v oblasti programování řetězce obsahující žolíkový znak a řetězec. Vytváření globů se nazývá globování. Například příkaz v programovacím jazyce Bash mv *.txt textfiles/
přesune všechny txt soubory z aktuálního adresáře do adresáře textfiles
. V tomto případě je *
žolíkový znak pro jakýkoli řetězec znaků vyjma znaku /,
část *.txt
je glob. Dalším běžným zástupným znakem je otazník (?
), který zastupuje jeden znak. Například mv ?.txt shorttextfiles/
přesune všechny txt soubory pojmenované jedním znakem z aktuálního adresáře do adresáře shorttextfiles
, zatímco ??.txt
bude odpovídat všem textovým souborům, jejichž název se skládá ze 2 znaků.
Kromě shody názvů souborů se globs také široce používají pro porovnávání libovolných řetězců (shoda zástupných znaků). V této funkci je společným rozhraním fnmatch
.
Původ
editovatPříkaz glob, zkratka pro global (česky globální), pochází z nejstarších verzí Unixu.[1] Interpreti příkazů raných verzí Unixu (1. až 6. vydání, 1969–1975) se spoléhali na samostatný program pro rozšíření zástupných znaků v argumentech bez uvozovek na příkaz glob. Tento program provedl rozšíření a dodal rozšířený seznam cest k souboru příkazu k provedení.
Glob byl původně napsán v programovacím jazyce B.[2] Později byla tato funkce přidána do knihovny programovacího jazyka C. Tuto funkci ve formátu glob()
, používají programy jako je shell. Obvykle je definována na základě funkce s názvem fnmatch()
, která testuje, zda řetězec odpovídá danému vzoru – program používající tuto funkci pak může iterovat řadu řetězců (obvykle názvy souborů), aby určil, které z nich jsou si rovny. Obě funkce jsou součástí dokumentace POSIX: funkce definované v POSIX.1 od roku 2001 a syntaxe definovaná v POSIX.2.[3][4]
Globy nanehrazují unixové označení skrytých souborů. Pokud má glob zahrnout i skrytý soubor, který bývá na začátku označen čárkou, musí se před zástupný znak vložit tečka. Například *
odpovídá všem viditelným souborům, zatímco .*
odpovídá všem skrytým souborům.
Syntax
editovatNejběžnější žolíkové znaky jsou *
, ?
a [něco]
.
Žolíkový znak | Popis | Příklad | Odpovídá | Neodpovídá |
---|---|---|---|---|
|
odpovídá libovolnému počtu libovolných znaků včetně žádného | řád*
|
řád , řády , řád a neřád
|
neřád , ád
|
*řád*
|
řád , řády , řády a neřády , neřád
|
řá
| ||
?
|
odpovídá libovolnému jednotlivému znaku | ?es
|
Pes , pes , bes
|
es , náves , eso
|
???
|
odpovídá libovolným třem znakům | ???es
|
náves , 256es , a pes
|
pes , es , maxipes
|
[abc]
|
odpovídá jednomu znaku uvedenému v závorce | [PV]es
|
Pes , Ves
|
pes , ves , PVes , Les , les , náves , Eso
|
[a-z]
|
odpovídá jednomu znaku z rozsahu (závislého na národním prostředí) uvedeného v závorce | [a-z]es
|
aes , bes , ces , čes až zes
|
žes , es , a pes
|
Obvykle se znak oddělovače cesty (/
na Linuxu/Unixu, MacOS atd. nebo \
na Windows) nikdy nebude shodovat. Některé shelly, jako je Bash, mají funkce, které uživatelům umožňují toto obejít.[5]
Systémy na bázi Unix
editovatNa systémech podobných Unixu fungují znaky *
a ?
tak, jak je uvedeno výše, zatímco řetězec [něco]
má dva další významy:[6][7]
Žolýkový znak | Popis | Příklad | Odpovídá | Neodpovídá |
---|---|---|---|---|
[!abc]
|
odpovídá jednomu znaku, který není uveden v závorce | [!P]es
|
les , Les , pes
|
Pes
|
[!a-z]
|
odpovídá jednomu znaku, který není z rozsahu uvedeného v závorce | [!c-z]es
|
aes , bes , žes , es , a pes
|
ces , pes , les
|
Rozsahy mohou také zahrnovat předdefinované třídy znaků, třídy ekvivalence pro znaky s diakritikou a symboly řazení pro znaky, které se obtížně zadávají. Jsou definovány tak, aby odpovídaly hranatým závorkám v regulárních výrazech standardu POSIX.[6][7]
Unixové globování je řešeno shellem podle POSIXu. Globuje se s názvy souborů na příkazovém řádku a v shellových skryptech. Příkaz case
v shellu nařízený POSIXem poskytuje porovnávání vzorů pomocí vzorů glob.
Některé shelly (jako je C shell a Bash) podporují další syntaxi známou jako alternace nebo expanze složených závorek. Protože to není součástí syntaxe glob, není poskytováno v case
. Rozbaluje se pouze na příkazovém řádku před globováním.
Shell Bash také podporuje následující rozšíření:[8]
- Rozšířené globování (extglob): umožňuje použití jiných operátorů pro párování vzorů s více výskyty vzoru uzavřeného v závorkách, což v podstatě poskytuje chybějící kleene hvězdu a alternaci pro popis regulárních jazyků. Lze jej povolit nastavením možnosti
extglob
shell. Tato možnost pochází z Korn shellu verze 3.[9] GNU fnmatch a glob mají totožné rozšíření.[3] - globstar: umožňuje, aby
**
jako komponenta názvu rekurzivně odpovídala libovolnému počtu vrstev neskrytých adresářů.[9] Podporováno také knihovnami Javascriptu a globováním v Pythonu[10].
Odkazy
editovatReference
editovatV tomto článku byl použit překlad textu z článku glob (programming) na anglické Wikipedii.
- ↑ Wayback Machine. web.archive.org [online]. 2000-08-29 [cit. 2023-04-24]. Dostupné v archivu pořízeném z originálu dne 2000-08-29.
- ↑ https://www.cs.dartmouth.edu/~doug/reader.pdf
- ↑ a b fnmatch(3) - Linux manual page. man7.org [online]. [cit. 2023-04-24]. Dostupné online.
- ↑ glob(3) - Linux manual page. man7.org [online]. [cit. 2023-04-24]. Dostupné online.
- ↑ Bash Reference Manual. www.gnu.org [online]. [cit. 2023-04-24]. Dostupné online.
- ↑ a b Shell Command Language. pubs.opengroup.org [online]. [cit. 2023-04-24]. Dostupné online.
- ↑ a b glob(7) - Linux manual page. man7.org [online]. [cit. 2023-04-24]. Dostupné online.
- ↑ glob - Greg's Wiki. mywiki.wooledge.org [online]. [cit. 2023-04-24]. Dostupné online.
- ↑ a b Pattern Matching (Bash Reference Manual). www.gnu.org [online]. [cit. 2023-04-24]. Dostupné online.
- ↑ BOYLE, Tara. The Python Glob Module. Medium [online]. 2021-01-16 [cit. 2023-04-24]. Dostupné online. (anglicky)