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 metacaratteri. Poco dopo venne incorporato nella shell.
Al giorno d’oggi c’è anche una routine di libreria glob(3) che svolge la stessa funzione per un programma utente.
Le regole sono le seguenti (POSIX.2, 3.13).
Corrispondenze
di metacaratteri
Una stringa è un modello di metacaratteri se contiene
uno dei caratteri '?', '*aq o '[aq. 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 nella forma "[...]", in cui il primo carattere dopo la '[' iniziale non è un '!' corrisponde ad un carattere singolo, cioè a qualsiasi carattere fra quelli racchiusi tra le parentesi. La stringa tra le parentesi non può essere vuota; perciò è possibile avere una ']' fra parentesi, purché essa sia il primo carattere (perciò "[][!]" corrisponde ai tre caratteri '[', ']' e '!').
Intervalli
C’è una convenzione speciale: due caratteri separati da '−' indicano un intervallo (perciò "[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 (perciò "[]−]" corrisponde solo ai due caratteri ']' e '−', e "[−−0]" corrisponde ai tre caratteri '−', '.', '0', dato che '/' non ha corrispondenze).
Complementazione
Un’espressione "[!...]" corrisponde ad un carattere singolo, cioè a qualsiasi carattere cui non corrisponda l’espressione ottenuta rimuovendo il '!' iniziale (perciò "[!]a−]" corrisponde a qualsiasi carattere singolo eccetto ']', 'a' e '−'.).
Si può rimuovere il significato speciale di '?', '*' e '[' facendoli precedere da una backslash, o, nel caso l’espressione sia parte di una riga di comando della shell, ponendoli fra virgolette doppie. Fra parentesi quadre questi caratteri hanno un significato letterale. Perciò "[[?*\]" corrisponde ai quattro caratteri '[', '?', '*' e '\'.
Percorsi
Il globbing si applica separatamente a ogni componente di un
percorso. A uno '/' in un percorso non può
corrispondere uno dei metacaratteri '?' o '*', né un
intervallo come "[.−0]". Un
intervallo non può contenere uno '/' esplicito: il
risultato sarebbe un errore di sintassi.
Se il nome di un file inizia con un '.', deve esserci una corrispondenza esplicita per il '.' (perciò rm * non rimuove .profile, e tar c * non archivia tutti i file: tar c . è meglio).
Elenchi
vuoti
La chiara e semplice regola precedente: "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
con questo comando:
shopt -s nullglob
(Problemi simili accadono in altri casi. Per esempio, mentre script vecchi usano
rm `find . −name "*~"`
per uno script nuovo bisogna usare
rm −f nosuchfile `find . −name "*~"`
per evitare messaggi 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; inoltre
le convenzioni non sono le stesse: per esempio, '*' in
un’espressione regolare significa zero o più
copie di quanto precede.
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 gli intervalli erano originariamente
interpretati 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 denoti l’insieme di
caratteri i cui codici sono compresi fra il codice di X e
quello di Y. Comunque 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: vale a dire (i) la
negazione, (ii) caratteri singoli espliciti e (iii)
intervalli. POSIX definisce gli intervalli in un modo
internazionalmente più utile e aggiunge altri tre
tipi:
(iii) Intervalli del tipo X−Y che includono tutti i caratteri compresi tra X e Y (inclusi) 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 'z'. Queste classi di carattere sono definite dalla categoria LC_CTYPE nella localizzazione corrente.
(v) Elementi di collazione, come "[.ch.]" o "[.a-acute.], in cui 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=]", in cui la stringa compresa tra "[=" e "=]" è un qualsiasi elemento di collazione nella sua classe di equivalenza, come 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), fnmatch(3), glob(3), locale(7), regex(7)
COLOPHON
Questa pagina fa parte del rilascio 3.73 del progetto Linux man-pages. Una descrizione del progetto, le istruzioni per la segnalazione degli errori, e l’ultima versione di questa pagina si trova su http://www.kernel.org/doc/man−pages/.
La versione
italiana fa parte del pacchetto man-pages-it v. 3.73,
a cura di: ILDP "Italian Linux Documentation
Project" http://www.pluto.it/ildp
Per la traduzione in italiano si può fare riferimento
a http://www.pluto.it/ildp/collaborare/
Segnalare eventuali errori di traduzione a
ildp [AT] pluto.it