Provided by:
manpages-it_0.3.4-5_all 
NOME
glob - Globbare i 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 ‘[’. Globbare è l’operazione che espande un modello di
metacaratteri in un elenco di percorsi che corrisponde al modello. Una
corrispondenza è definita da:
Un ‘?’ (non fra parentesi) corrisponde ad un carattere singolo.
Un ‘*’ (non fra parentesi) 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
Una convenzione speciale: due caratteri separati da un ‘-’ 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 ‘-’,
mentre ‘[--/]’ corrisponde ai tre caratteri ‘-’, ‘.’, ‘/’).
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 a ‘?’, ‘*’ e ‘[’ il loro significato speciale
precedendoli con uno 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
Ogni componente di un percorso viene globbata separatamente. A uno ’/’
di un percorso non può corrispondere una 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 esplicitamente per il ‘.’. Per es., ‘rm *’ non rimuove
LISTE VUOTE
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 liste vuote, 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 IR 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 ‘find . -name "*~"‘
per evitare messagi di errore di rm invocato con una lista vuota 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: 1. una negazione 2. un
esplicito carattere singolo 3. un intervallo. POSIX definisce
gl’intervalli in un modo internazionalmente più utile e aggiunge altri
tre tipi:
3. 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.
4. 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.
5. 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.
6. 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áàäâ]», cioè a «[a[.a-
acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]».
VEDERE ANCHE
sh(1), glob(3), fnmatch(3), locale(7), regex(7)