glob(7) Miscellaneous Information Manual glob(7) NAZWA glob - uzupelnianie sciezek za pomoca wzorcow wieloznacznikowych OPIS Dawno temu, w systemie UNIX V6 istnial program /etc/glob interpretujacy wzorce wieloznacznikowe. Jakis czas pozniej ta funkcja stala sie wbudowana cecha powloki. Obecnie istnieje rowniez funkcja biblioteczna glob(3), ktora pelni taka sama funkcje dla programow uzytkownika. Reguly sa nastepujace (POSIX.2, 3.13). Dopasowanie wieloznacznikow Dany lancuch jest wzorcem wieloznacznikowym, jesli zawiera jeden ze znakow: ,,?", ,,*" lub ,,[". Interpretacja wieloznacznikow (ang. globbing) to operacja interpretacji wzorca wieloznacznikowego na liste sciezek pasujacych do wzorca. Dopasowanie wyglada nastepujaco: ,,?" (poza nawiasami kwadratowymi) dopasowuje dowolny pojedynczy znak. ,,*" (poza nawiasami kwadratowymi) dopasowuje dowolny lancuch, w tym lancuch pusty. Klasy znakowe Wyrazenie ,,[...]" gdzie pierwszym znakiem po otwierajacym ,,[" nie jest ,,!" dopasowuje pojedynczy znak, a dokladnie dowolny ze znakow pomiedzy nawiasami kwadratowymi. Lancuch ograniczony nawiasami kwadratowymi nie moze byc pusty; zatem znak ,,]" moze pojawic sie w nawiasie kwadratowym, o ile tylko bedzie pierwszym znakiem (dlatego ,,[][!]" dopasuje trzy znaki: ,,[", ,,]" i ,,!"). Zakresy Istnieje jedna specjalna konwencja: dwa znaki rozdzielone znakiem ,,-" oznaczaja zakres (zatem ,,[A-Fa-f0-9]" jest rownowazne ,,[ABCDEFabcdef0123456789]"). Aby znak ,,-" mial swe doslowne znaczenie, nalezy go umiescic jako pierwszy lub ostatni znak miedzy nawiasami kwadratowymi (zatem ,,[]-]" dopasuje jedynie dwa znaki: ,,]" i ,,-", natomiast ,,[--0]" dopasuje trzy znaki: ,,-", ,,." i ,,0", poniewaz ,,/" nie moze byc dopasowane). Dopelnianie Wyrazenie ,,[!...]" dopasuje pojedynczy znak, a dokladnie dowolny znak, ktory nie zostanie dopasowany przez wyrazenie, otrzymane po usunieciu z niego poczatkowego ,,!" (zatem ,,[!]a-]" dopasuje kazdy pojedynczy znak poza ,,]", ,,a" i ,,-"). Mozna usunac specjalne znaczenie znakow ,,?", ,,*" i ,,[" poprzedzajac je odwrotnym ukosnikiem lub, jesli sa czescia wiersza polecenia powloki, ujmujac je w cudzyslow. Pomiedzy nawiasami kwadratowymi, znaki te zachowuja swe doslowne znaczenie. Zatem ,,[[?*\]" dopasuje cztery znaki: ,,[", ,,?", ,,*" i ,,\". Sciezki Interpretacja wieloznacznikow jest stosowana do kazdej skladowej sciezki z osobna. ,,/" w sciezce nie moze byc dopasowane wieloznacznikiem ,,?" i ,,*" ani zakresem takim jak ,,[.-0]". Zakres zawierajacy doslowny znak ,,/" stanowi blad skladni (POSIX wymaga, aby takie wzorce z bledem skladni zostaly pozostawiane bez zmian). Jesli sciezka zaczyna sie od ,,.", znak ten musi zostac podany wprost w wyrazeniu (zatem rm * nie usunie pliku .profile, a tar c * nie zarchiwizuje wszystkich plikow uzytkownika; lepsze bedzie tar c .). Puste listy Ladna i prosta regula podana wyzej: ,,rozwin wzorce wieloznacznikowe na liste pasujacych sciezek" byla pierwotna definicja systemu UNIX. Pozwalala na wzorce, ktore rozwijaly sie na pusta liste, jak w xv -wait 0 *.gif *.jpg gdy mogl nie wystepowac zaden plik *.gif (i nie byl to blad). Jednak POSIX wymaga, aby wzorzec wieloznacznikowy byl pozostawiany bez zmian, jesli jest skladniowo niepoprawny albo gdy lista dopasowanych sciezek jest pusta. W powloce bash mozna wymusic klasyczne zachowanie poleceniem: shopt -s nullglob (Podobne problemy pojawiaja sie tez gdzie indziej. Na przyklad stare skrypty maja rm `find . -name "*~"` a nowe skrypty wymagaja rm -f braktakiegopliku `find . -name "*~"` aby uniknac bledu polecenia rm wywolanego z pusta lista argumentow). UWAGI Wyrazenia regularne Prosze zauwazyc, ze wzorce wieloznacznikowe nie sa wyrazeniami regularnymi, choc sa nieco podobne. Po pierwsze, dopasowuja nazwy plikow, a nie tekst, a po wtore, konwencje roznia sie: np. w wyrazeniu regularnym ,,*" oznacza zero lub wiecej wystapien poprzedzajacego elementu. Obecnie, gdy wyrazenia regularne posiadaja wyrazenia klamrowe, gdzie negacje oznacza sie przez ,,^", POSIX deklaruje wynik wyrazenia klamrowego ,,[^...]" jako niezdefiniowany. Klasy znakowe i ustawienia miedzynarodowe Zakresy pierwotnie mialy znaczyc oczywiscie zakresy ASCII, zatem ,,[ -%]" oznaczal ,,[ !"#$%]", a ,,[a-z]" oznaczal ,,dowolna mala litere". Niektore implementacje Uniksowe generalizuja to w ten sposob, ze zakres X-Y oznacza zbior znakow z kodami pomiedzy kodem X i kodem Y. Jednak wymaga to, aby uzytkownik znak kodowanie znakow uzywane w lokalnym systemie, a co wiecej, nie jest praktyczne, gdy kolejnosc sortowania w lokalnym alfabecie rozni sie od kolejnosci kodow znakow. Z tego wzgledu norma POSIX rozszerzyla znacznie notacje klamrowa, zarowno w przypadku wzorcow wieloznacznikowych jak i w przypadku wyrazen regularnych. Powyzej opisano trzy typy elementow, ktore moga pojawic sie w wyrazeniach klamrowych: (I) negacje, (II) doslowny pojedynczy znak i (III) zakresy. POSIX okresla zakresy w sposob bardziej uzyteczny w kontekscie miedzynarodowym oraz dodaje trzy dodatkowe typy: (III) Zakresy X-Y obejmuja wszystkie znaki, ktore znajduja sie pomiedzy X i Y (wlacznie) w biezacej kolejnosci sortowania zdefiniowanej przez kategorie LC_COLLATE w biezacych ustawieniach locale. (IV) Nazwane klasy znakowe, jak [:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:] tak wiec mozna uzyc ,,[[:lower:]]" zamiast ,,[a-z]", co zadziala poprawnie rowniez w Danii, gdzie alfabet ma jeszcze trzy litery po literze ,,z" (albo w jezyku polskim, z polskim ,,z" i ,,z" - przyp. tlum.). Te klasy znakowe sa zdefiniowane w kategorii LC_CTYPE w biezacych ustawieniach locale. (V) Symbole sortowania, takie jak ,,[.ch.]" lub ,,[.a-acute.]", gdzie lancuch pomiedzy ,,[." a ,,.]" jest elementem sortowania zdefiniowanym dla aktualnego ustawienia locale. Prosze zauwazyc, ze moze byc to element zlozony z wielu znakow. (VI) Wyrazenia klasy rownowaznej, jak ,,[=a=]", gdzie lancuch pomiedzy ,,[=" a ,,=]" jest elementem sortowania ze swojej klasy rownowaznej, zdefiniowanym dla biezacych ustawien lokale. Na przyklad ,,[[=a=]]" moze byc rownowazny,,[aaaaa]", tj. ,,[a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]". ZOBACZ TAKZE sh(1), fnmatch(3), glob(3), locale(7), regex(7) TLUMACZENIE Tlumaczenie niniejszej strony podrecznika: Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.15 17 maja 2025 r. glob(7)