glob(7)

NUME
glob - globalizarea numelor de rută

DESCRIERE
Cu mult timp în urmă, în UNIX V6, exista un program /etc/glob care putea expanda modelele cu caractere joker. La scurt timp după aceea, acesta a devenit un program încorporat în shell.

În prezent, există, de asemenea, o rutină de bibliotecă glob(3) care va îndeplini această funcție pentru un program de utilizator.

Regulile sunt următoarele (POSIX.2, 3.13).

  Potrivirea cu caractere joker
Un șir de caractere este un model de tip joker dacă conține unul dintre caracterele „?”, „*” sau „[”. Globalizarea este operația care expandează un model de caractere joker într-o listă de nume de rute care corespund modelului. Potrivirea este definită de:

Un „?” (nu între paranteze) se potrivește cu orice caracter unic.

Un „*” (nu între paranteze) se potrivește cu orice șir, inclusiv cu șirul gol.

Clase de caractere

O expresie „[...]” în care primul caracter după „[” de început nu este un „!” se potrivește cu un singur caracter, și anume oricare dintre caracterele cuprinse între paranteze. Șirul cuprins între paranteze nu poate fi gol; prin urmare, „]” poate fi permis între paranteze, cu condiția ca acesta să fie primul caracter; (astfel, „[][!]” se potrivește cu cele trei caractere „[”, „]” și „!”).

Intervale

Există o convenție specială: două caractere separate prin „-” reprezintă un interval; (astfel, „[A-Fa-f0-9]” este echivalent cu „[ABCDEFabcdef0123456789]”). Se poate include „-” în sensul său literal, făcându-l primul sau ultimul caracter dintre paranteze; (astfel, „[]-]” se potrivește doar cu cele două caractere „]” și „-”, iar „[--0]” se potrivește cu cele trei caractere „-”, „.” și „0”, deoarece „/” nu poate fi potrivit).

Complementare

O expresie „[![...]” se potrivește cu un singur caracter, și anume orice caracter care nu se potrivește cu expresia obținută prin eliminarea primului „!” din ea; (astfel, „[!]a-]” se potrivește cu orice caracter, cu excepția lui „]”, „a” și „-”).

Se poate elimina semnificația specială a „?”, „*” și „[” precedându-le de o bară oblică inversă sau, în cazul în care acestea fac parte dintr-o linie de comandă de shell, încadrându-le între ghilimele. Între paranteze, aceste caractere sunt de sine stătătoare. Astfel, „[[?*\” se potrivește cu cele patru caractere „[”, „?”, „*” și „\”.

  Nume de rută
Globalizarea se aplică separat pentru fiecare dintre componentele unui nume de rută. Un „/” într-un nume de rută nu poate fi asociat cu un joker „?” sau „*”, sau cu un interval de tipul „[.-0]”. Un interval care conține un caracter explicit „/” este incorect din punct de vedere sintactic; (POSIX cere ca modelele incorecte din punct de vedere sintactic să fie lăsate neschimbate).

În cazul în care un nume de fișier începe cu un „.”, acest caracter trebuie să se potrivească în mod explicit; (astfel, comanda «rm *» nu va elimina .profile, iar comanda «tar c *» nu va arhiva toate fișierele; execuția comenzii anterioare, cu „modelul” schimbat «tar c .» este mai indicată).

  Liste goale
Regula frumoasă și simplă dată mai sus: „expandează un model cu caractere joker în lista de nume de rută corespondente” a fost definiția originală UNIX. Aceasta permitea să existe modele care se extind într-o listă goală, ca în cazul

    xv -wait 0 *.gif *.jpg

unde poate că nu există niciun fișier *.gif (și aceasta nu este o eroare). Cu toate acestea, POSIX impune ca un model cu caracter joker să fie lăsat neschimbat atunci când este incorect din punct de vedere sintactic sau când lista de nume de rută corespondente este goală. Cu bash se poate forța comportamentul clasic folosind această comandă:

    shopt -s nullglob

(Probleme similare apar și în alte cazuri. De exemplu, în cazul în care scripturile vechi au

    rm `find . -name "*~"`

scripturile noi necesită

    rm -f nosuchfile `find . -name "*~"`

ca să evite mesajele de eroare de la rm apelat cu o listă de argumente goală).

NOTE

  Expresii regulate
Rețineți că modelele cu caractere joker nu sunt expresii regulate, deși sunt puțin asemănătoare. În primul rând, acestea se potrivesc mai degrabă cu nume de fișiere decât cu text și, în al doilea rând, convențiile nu sunt aceleași: de exemplu, într-o expresie regulată „*” înseamnă zero sau mai multe copii ale lucrului precedent.

Acum că expresiile regulate au expresii cu paranteze în care negația este indicată de un „^”, POSIX a declarat că efectul unui model cu caracter joker „[^...]” este nedefinit.

  Clase de caractere și internaționalizare
Desigur, intervalele au fost inițial concepute ca intervale ASCII, astfel încât „[ -%]” reprezintă „[ !"#$%]” și „[a-z]” reprezintă „orice literă minusculă”. Unele implementări UNIX au generalizat acest lucru, astfel încât un interval X-Y reprezintă setul de caractere cu coduri între codurile pentru X și Y. Cu toate acestea, acest lucru necesită ca utilizatorul să cunoască codificarea caracterelor utilizată pe sistemul local și, în plus, nu este convenabil dacă secvența de colaționare pentru alfabetul local diferă de ordinea codurilor de caractere. Prin urmare, POSIX a extins foarte mult notația parantezelor, atât pentru modelele cu caractere joker, cât și pentru expresiile regulate. În cele de mai sus am văzut trei tipuri de elemente care pot apărea într-o expresie cu paranteze: și anume (i) negația, (ii) caractere unice explicite și (iii) intervale. POSIX specifică intervalele într-un mod mai util la nivel internațional și adaugă încă trei tipuri:

(iii) Intervalele X-Y cuprind toate caracterele care se încadrează între X și Y (inclusiv) în secvența de colaționare curentă, așa cum este definită de categoria LC_COLLATE din configurația regională curentă.

(iv) Clase de caractere numite, cum ar fi

[:alnum:]  [:alpha:]  [:blank:]  [:cntrl:]
[:digit:]  [:graph:]  [:lower:]  [:print:]
[:punct:]  [:space:]  [:upper:]  [:xdigit:]

astfel încât să se poată spune „[[:lower:]]” în loc de „[a-z]”, iar lucrurile să funcționeze și în Danemarca, unde există trei litere după „z” în alfabet. Aceste clase de caractere sunt definite de categoria LC_CTYPE din configurația regională curentă.

(v) Simboluri de colaționare, cum ar fi „[.ch.]” sau „[.a-acute.]”, în cazul în care șirul dintre „[.” și „.]” este un element de colaționare definit pentru configurația regională curentă. Rețineți că acesta poate fi un element cu mai multe caractere.

(vi) Expresii din clasa de echivalență, cum ar fi „[=a=]”, unde șirul dintre „[=” și „=]” este orice element de colaționare din clasa de echivalență, așa cum este definit pentru configurația regională curentă. De exemplu, „[[=a=]]” poate fi echivalent cu „[aáàäâ]”, adică cu „[a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]”.

CONSULTAȚI ȘI
sh(1), fnmatch(3), glob(3), locale(7), regex(7)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.