17.2. Globbing

Bash, di per sé, non è in grado di riconoscere le Espressioni Regolari. Negli script, sono i comandi e le utility -- come sed e awk -- che interpretano le ER.

Bash, invece, esegue l'espansione del nome del file [1] -- un processo conosciuto come "globbing" -- che, però, non usa la serie standard di caratteri delle ER, ma riconosce ed espande i caratteri jolly. Il globbing interpreta i caratteri jolly standard * e ?, liste di caratteri racchiuse tra parentesi quadre ed alcuni altri caratteri speciali (come ^, che nega il senso di una ricerca). Esistono, tuttavia, alcune importanti limitazioni nell'impiego dei caratteri jolly. Stringhe che contengono l'* non verificano i nomi dei file che iniziano con un punto, come, ad esempio, .bashrc. [2] In modo analogo, il ? ha un significato diverso da quello che avrebbe se impiegato in una ER.

bash$ ls -l
total 2
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 a.1
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1
-rw-rw-r--    1 bozo  bozo       466 Aug  6 17:48 t2.sh
-rw-rw-r--    1 bozo  bozo       758 Jul 30 09:02 test1.txt

bash$ ls -l t?.sh
-rw-rw-r--    1 bozo  bozo       466 Aug  6 17:48 t2.sh

bash$ ls -l [ab]*
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 a.1
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1

bash$ ls -l [a-c]*
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 a.1
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1

bash$ ls -l [^ab]*
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1
-rw-rw-r--    1 bozo  bozo       466 Aug  6 17:48 t2.sh
-rw-rw-r--    1 bozo  bozo       758 Jul 30 09:02 test1.txt

bash$ ls -l {b*,c*,*est*}
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1
-rw-rw-r--    1 bozo  bozo       758 Jul 30 09:02 test1.txt
	      

Bash esegue l'espansione del nome del file sugli argomenti passati da riga di comando senza il quoting. Il comando echo dimostra questa funzionalità.

bash$ echo *
a.1 b.1 c.1 t2.sh test1.txt

bash$ echo t*
t2.sh test1.txt
	      

Nota

È possibile modificare il modo in cui Bash interpreta i caratteri speciali nel globbing. Il comando set -f disabilita il globbing e shopt, con le opzioni nocaseglob e nullglob, ne cambia il comportamento.

Vedi anche Esempio 10-4.

Note

[1]

Espansione del nome del file significa completare un nome di file che contiene caratteri speciali. Per esempio, esempio.??? potrebbe espandersi a esempio.001 e/o esempio.txt.

[2]

L'espansione del nome del file può verificare i nomi di file che iniziano con il punto, ma solo se il modello lo include esplicitamente con il suo valore letterale.

~/[.]bashrc    #  Non viene espanso a ~/.bashrc 
~/?bashrc      #  Neanche in questo caso.
               #  Nel globbing i caratteri jolly e i metacaratteri NON
               #+ espandono il punto.

~/.[b]ashrc    #  Viene espanso a ~./bashrc
~/.ba?hrc      #  Idem.
~/.bashr*      #  Idem.

#  Impostando l'opzione "dotglob" si abilita anche l'espansione del punto.

#  Grazie, S.C.