Scroll to navigation

glob(7) Miscellaneous Information Manual glob(7)

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.

5 lutego 2023 r. Linux man-pages 6.03