Provided by: manpages-pl_4.28.0-2_all 

NAZWA
glob - uzupełnianie ścieżek za pomocą wzorców wieloznacznikowych
OPIS
Dawno temu, w systemie UNIX V6 istniał program /etc/glob interpretujący wzorce wieloznacznikowe. Jakiś
czas później ta funkcja stała się wbudowaną cechą powłoki.
Obecnie istnieje również funkcja biblioteczna glob(3), która pełni taką samą funkcję dla programów
użytkownika.
Reguły są następujące (POSIX.2, 3.13).
Dopasowanie wieloznaczników
Dany łańcuch jest wzorcem wieloznacznikowym, jeśli zawiera jeden ze znaków: „?”, „*” lub „[”.
Interpretacja wieloznaczników (ang. globbing) to operacja interpretacji wzorca wieloznacznikowego na
listę ścieżek pasujących do wzorca. Dopasowanie wygląda następująco:
„?” (poza nawiasami kwadratowymi) dopasowuje dowolny pojedynczy znak.
„*” (poza nawiasami kwadratowymi) dopasowuje dowolny łańcuch, w tym łańcuch pusty.
Klasy znakowe
Wyrażenie „[...]” gdzie pierwszym znakiem po otwierającym „[” nie jest „!” dopasowuje pojedynczy znak, a
dokładnie dowolny ze znaków pomiędzy nawiasami kwadratowymi. Łańcuch ograniczony nawiasami kwadratowymi
nie może być pusty; zatem znak „]” może pojawić się w nawiasie kwadratowym, o ile tylko będzie pierwszym
znakiem (dlatego „[][!]” dopasuje trzy znaki: „[”, „]” i „!”).
Zakresy
Istnieje jedna specjalna konwencja: dwa znaki rozdzielone znakiem „-” oznaczają zakres (zatem
„[A-Fa-f0-9]” jest równoważne „[ABCDEFabcdef0123456789]”). Aby znak „-” miał swe dosłowne znaczenie,
należy go umieścić jako pierwszy lub ostatni znak między nawiasami kwadratowymi (zatem „[]-]” dopasuje
jedynie dwa znaki: „]” i „-”, natomiast „[--0]” dopasuje trzy znaki: „-”, „.” i „0”, ponieważ „/” nie
może być dopasowane).
Dopełnianie
Wyrażenie „[!...]” dopasuje pojedynczy znak, a dokładnie dowolny znak, który nie zostanie dopasowany
przez wyrażenie, otrzymane po usunięciu z niego początkowego „!” (zatem „[!]a-]” dopasuje każdy
pojedynczy znak poza „]”, „a” i „-”).
Można usunąć specjalne znaczenie znaków „?”, „*” i „[” poprzedzając je odwrotnym ukośnikiem lub, jeśli są
częścią wiersza polecenia powłoki, ujmując je w cudzysłów. Pomiędzy nawiasami kwadratowymi, znaki te
zachowują swe dosłowne znaczenie. Zatem „[[?*\]” dopasuje cztery znaki: „[”, „?”, „*” i „\”.
Ścieżki
Interpretacja wieloznaczników jest stosowana do każdej składowej ścieżki z osobna. „/” w ścieżce nie może
być dopasowane wieloznacznikiem „?” i „*” ani zakresem takim jak „[.-0]”. Zakres zawierający dosłowny
znak „/” stanowi błąd składni (POSIX wymaga, aby takie wzorce z błędem składni zostały pozostawiane bez
zmian).
Jeśli ścieżka zaczyna się od „.”, znak ten musi zostać podany wprost w wyrażeniu (zatem rm * nie usunie
pliku .profile, a tar c * nie zarchiwizuje wszystkich plików użytkownika; lepsze będzie tar c .).
Puste listy
Ładna i prosta reguła podana wyżej: „rozwiń wzorce wieloznacznikowe na listę pasujących ścieżek” była
pierwotną definicją systemu UNIX. Pozwalała na wzorce, które rozwijały się na pustą listę, jak w
xv -wait 0 *.gif *.jpg
gdy mógł nie występować żaden plik *.gif (i nie był to błąd). Jednak POSIX wymaga, aby wzorzec
wieloznacznikowy był pozostawiany bez zmian, jeśli jest składniowo niepoprawny albo gdy lista
dopasowanych ścieżek jest pusta. W powłoce bash można wymusić klasyczne zachowanie poleceniem:
shopt -s nullglob
(Podobne problemy pojawiają się też gdzie indziej. Na przykład stare skrypty mają
rm `find . -name "*~"`
a nowe skrypty wymagają
rm -f braktakiegopliku `find . -name "*~"`
aby uniknąć błędu polecenia rm wywołanego z pustą listą argumentów).
UWAGI
Wyrażenia regularne
Proszę zauważyć, że wzorce wieloznacznikowe nie są wyrażeniami regularnymi, choć są nieco podobne. Po
pierwsze, dopasowują nazwy plików, a nie tekst, a po wtóre, konwencje różnią się: np. w wyrażeniu
regularnym „*” oznacza zero lub więcej wystąpień poprzedzającego elementu.
Obecnie, gdy wyrażenia regularne posiadają wyrażenia klamrowe, gdzie negację oznacza się przez „^”, POSIX
deklaruje wynik wyrażenia klamrowego „[^...]” jako niezdefiniowany.
Klasy znakowe i ustawienia międzynarodowe
Zakresy pierwotnie miały znaczyć oczywiście zakresy ASCII, zatem „[ -%]” oznaczał „[ !"#$%]”, a „[a-z]”
oznaczał „dowolną małą literę”. Niektóre implementacje Uniksowe generalizują to w ten sposób, że zakres
X-Y oznacza zbiór znaków z kodami pomiędzy kodem X i kodem Y. Jednak wymaga to, aby użytkownik znak
kodowanie znaków używane w lokalnym systemie, a co więcej, nie jest praktyczne, gdy kolejność sortowania
w lokalnym alfabecie różni się od kolejności kodów znaków. Z tego względu norma POSIX rozszerzyła
znacznie notację klamrową, zarówno w przypadku wzorców wieloznacznikowych jak i w przypadku wyrażeń
regularnych. Powyżej opisano trzy typy elementów, które mogą pojawić się w wyrażeniach klamrowych: (I)
negację, (II) dosłowny pojedynczy znak i (III) zakresy. POSIX określa zakresy w sposób bardziej użyteczny
w kontekście międzynarodowym oraz dodaje trzy dodatkowe typy:
(III) Zakresy X-Y obejmują wszystkie znaki, które znajdują się pomiędzy X i Y (włącznie) w bieżącej
kolejności sortowania zdefiniowanej przez kategorię LC_COLLATE w bieżących ustawieniach locale.
(IV) Nazwane klasy znakowe, jak
[:alnum:] [:alpha:] [:blank:] [:cntrl:]
[:digit:] [:graph:] [:lower:] [:print:]
[:punct:] [:space:] [:upper:] [:xdigit:]
tak więc można użyć „[[:lower:]]” zamiast „[a-z]”, co zadziała poprawnie również w Danii, gdzie alfabet
ma jeszcze trzy litery po literze „z” (albo w języku polskim, z polskim „ź” i „ż” - przyp. tłum.). Te
klasy znakowe są zdefiniowane w kategorii LC_CTYPE w bieżących ustawieniach locale.
(V) Symbole sortowania, takie jak „[.ch.]” lub „[.a-acute.]”, gdzie łańcuch pomiędzy „[.” a „.]” jest
elementem sortowania zdefiniowanym dla aktualnego ustawienia locale. Proszę zauważyć, że może być to
element złożony z wielu znaków.
(VI) Wyrażenia klasy równoważnej, jak „[=a=]”, gdzie łańcuch pomiędzy „[=” a „=]” jest elementem
sortowania ze swojej klasy równoważnej, zdefiniowanym dla bieżących ustawień lokale. Na przykład
„[[=a=]]” może być równoważny„[aáàäâ]”, tj. „[a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]”.
ZOBACZ TAKŻE
sh(1), fnmatch(3), glob(3), locale(7), regex(7)
TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Michał Kułach <michal.kulach@gmail.com>
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać
zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ
ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-
list@lists.sourceforge.net.
Linux man-pages 6.9.1 15 czerwca 2024 r. glob(7)