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.

 
Snímek obrazovky původní referenční stránky Unixu z roku 1971 pro glob

Pří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.

Nejběž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, česzes ž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

editovat

Na 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].

Reference

editovat

V tomto článku byl použit překlad textu z článku glob (programming) na anglické Wikipedii.

  1. 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. 
  2. https://www.cs.dartmouth.edu/~doug/reader.pdf
  3. a b fnmatch(3) - Linux manual page. man7.org [online]. [cit. 2023-04-24]. Dostupné online. 
  4. glob(3) - Linux manual page. man7.org [online]. [cit. 2023-04-24]. Dostupné online. 
  5. Bash Reference Manual. www.gnu.org [online]. [cit. 2023-04-24]. Dostupné online. 
  6. a b Shell Command Language. pubs.opengroup.org [online]. [cit. 2023-04-24]. Dostupné online. 
  7. a b glob(7) - Linux manual page. man7.org [online]. [cit. 2023-04-24]. Dostupné online. 
  8. glob - Greg's Wiki. mywiki.wooledge.org [online]. [cit. 2023-04-24]. Dostupné online. 
  9. a b Pattern Matching (Bash Reference Manual). www.gnu.org [online]. [cit. 2023-04-24]. Dostupné online. 
  10. BOYLE, Tara. The Python Glob Module. Medium [online]. 2021-01-16 [cit. 2023-04-24]. Dostupné online. (anglicky)