Provided by: manpages-it_2.80-5_all 

NOME
glob - Fare il globbing dei percorsi dei file
DESCRIZIONE
Molto tempo fa, in Unix V6, c'era un programma /etc/glob che espandeva i modelli di metacaretteri. Poco
dopo divenne parte della shell.
Al giorno d'oggi c'è pure una routine di libreria glob(3) per svolgere un simile compito a vantaggio dei
programmi utenti.
Le regole sono le seguenti (POSIX 1003.2, 3.13).
Corrispondenze di metacaratteri
Una stringa è un modello di metacaratteri se contiene uno dei caratteri `?', `*' o `['. Il globbing è
l'operazione che espande un modello di metacaratteri in un elenco di percorsi che corrisponde al modello.
Una corrispondenza è definita da:
Un `?' (non fra virgolette) corrisponde ad un carattere singolo.
Un `*' (non fra virgolette) corrisponde a qualsiasi stringa, compresa quella vuota.
Classi di Carattere
Un'espressione della forma `[...]', dove il primo caratttere dopo la `[' iniziale non è un `!',
corrisponde ad un carattere singolo, cioè a qualsiasi carattere fra quelli racchiusi tra le parentesi. La
stringa nelle parentesi non può essere vuota; perciò è possibile avere una `]' fra parentesi, purché essa
sia il primo carattere (ad es., `[][!]' corrisponde ai tre caratteri `[', `]' e `!').
Intervallo
C'è una convenzione speciale: due caratteri separati da `-' indicano un intervallo (ad es., `[A-Fa-f0-9]'
equivale a `[ABCDEFabcdef0123456789]'). Si può includere un `-' col suo significato letterale ponendolo
al primo o all'ultimo posto fra le parentesi (ad es. `[]-]' corrisponde solo ai due caratteri `]' e `-',
`[--0]' corrisponde ai tre caratteri `-', `.', `0', mentre `/' non ha corrispondenze.)
Complementazione
Un'espressione `[!...]' corrisponde ad un carattere singolo, cioè a qualsiasi carattere cui non
corrisponda l'espressione ottenuta rimuovendo il `!' iniziale (per es., `[!]a-]' corrisponde a qualsiasi
carattere singolo eccetto `]', `a' e `-').
Si può togliere il significato speciale di `?', `*' e `[' precedendoli con un backslash, o, nel caso
l'espressione sia parte di una riga di comando della shell, ponendola fra virgolette doppie. Fra
parentesi quadre questi caratteri hanno un significato letterale. Per es., `[[?*\]' corrisponde ai
quattro caratteri `[', `?', `*' e `\'.
Percorsi
Il globbing è applicato separatamente a ogni componente di un percorso. A uno '/' di un percorso non può
corrispondere uno dei metacaratteri `?' o `*', né un intervallo come `[.-0]'. Un intervallo non può
contenere uno '/' esplicito: ciò risulterebbe in un errore di sintassi.
Se il nome di un file inizia con un `.', deve esserci una corrispondenza esplicita per il `.'. Per es.,
`rm *' non rimuove
Elenchi vuoti
La chiara e semplice regola di più sopra: «espandere un modello di metacaratteri in un elenco di percorsi
che corrisponde al modello» era la definizione originale di Unix. Permetteva modelli che si espandevano
in elenchi vuoti, come in
xv -wait 0 *.gif *.jpg
quando, magari, non c'è nessun file *.gif (e questo non causa un errore). D'altra parte POSIX richiede
che un modello di metacaratteri non venga modificato se è sintatticamente sbagliato o se la lista dei
percorsi corrispondenti è vuota. Con bash si può forzare il comportamento classico ponendo
allow_null_glob_expansion=true.
(Problemi simili accadono in altri posti. Per es., mentre script vecchi usano
rm `find . -name "*~"`
per uno script nuovo bisogna usare
rm -f nosuchfile `find . -name "*~"`
per evitare messagi di errore di rm invocato con un elenco vuoto di argomenti)
NOTE
Espressioni regolari
Si noti che i modelli di metacaratteri non sono espressioni regolari, per quanto si assomiglino. Prima di
tutto corrispondono a nomi di file piuttosto che a testo, e poi le convenzioni non sono le stesse: per
esempio, `*' in un'espressione regolare vuol dire zero o più copie della cosa precedente.
Ora che le espressioni regolari usano espressioni fra parentesi quadre in cui la negazione è indicata con
un `^', POSIX ha dichiarato indefinito l'effetto di un modello come `[^...]'.
Classi di carattere e internazionalizzazione
Naturalmente gl'intervalli erano originariamente interpretate come intervalli ASCII, per cui `[ -%]'
stava per `[ !"#$%]' e `[a-z]' per «una qualsiasi minuscola». Alcune implementazioni Unix hanno
generalizzato questo comportamento in modo tale che l'intervallo X-Y denota l'insieme di caratteri i cui
codici sono compresi fra i codici di X e Y. D'altra parte, ciò richiede che l'utente conosca la codifica
usata sul sistema locale, e, inoltre, non è comodo quando la sequenza di collazione per l'alfabeto locale
è diversa dall'ordine dei codici di carattere. Perciò POSIX ha notevolmente esteso la notazione
parentetica, sia per i modelli di metacaratteri che per le espressioni regolari. Prima abbiamo visto tre
tipi di argomenti che possono apparire in un'espressione parentetica: (i) una negazione (ii) caratteri
singoli espliciti e (iii) intervalli. POSIX definisce gl'intervalli in un modo internazionalmente più
utile e aggiunge altri tre tipi:
(iii) Intervalli del tipo X-Y includono tutti i caratteri (estremi inclusi) compresi tra X e Y nella
sequenza di collazione definita dalla categoria LC_COLLATE nella localizzazione corrente.
(iv) Classi di carattere con nome, come
[:alnum:] [:alpha:] [:blank:] [:cntrl:]
[:digit:] [:graph:] [:lower:] [:print:]
[:punct:] [:space:] [:upper:] [:xdigit:]
in modo da poter dire «[[:lower:]]» al posto di «[a-z]» e ottenere il risultato corretto anche in danese,
dove ci sono tre lettere nell'alfabeto che vengono dopo la zeta. Queste classi di carattere sono definite
dalla categoria LC_CTYPE nella localizzazione corrente.
(v) Elementi di collazione, come «[.ch.]» o «[.a-acute.]», dove la stringa compresa fra «[.» e «.]» è un
elemento di collazione definito dalla localizzazione corrente. Si noti che questo può essere un elemento
composto da più caratteri.
(vi) Una classe di equivalenza, come «[=a=]», dove la stringa compresa tra «[=» e «=]» e un qualsiasi
elemento di collazione nella sua classe di equivalenza, definita dalla localizzazione corrente. Per
esempio, «[[=a=]]» potrebbe essere equivalente a «[aáàäâ]», (attenzione: questo è Latin-1) cioè a «[a[.a-
acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]».
VEDERE ANCHE
sh(1), fnmatch(3), glob(3), locale(7), regex(7)
Unix 24 agosto 2003 GLOB(7)