Quando si esegue ls *
l' *
è in fase di espansione , prima si passa alla ls
. Vale a dire se abbiamo tre file ( a
, b
e c
) in una directory ls *
è effettivamente in esecuzione ls a b c
.
Quando Bash non può espandersi, passa attraverso la stringa non elaborata¹. Ecco perché visualizzi i caratteri jolly nell'errore, insieme a un messaggio non trovato. ls
ho provato a mostrare l'elenco per un file chiamato letteralmente *.bash*
.
Quindi perché non si è espanso? Bene, per impostazione predefinita il globbing (come si chiama questa espansione jolly) non restituirà i file nascosti. Puoi cambiarlo con shopt -s dotglob
(che non persisterà a meno che tu non lo inserisca nel tuo .bashrc
- potrebbe essere disabilitato di default per una buona ragione, quindi fai attenzione), ecco una breve demo:
$ ls *.bash*
ls: cannot access *.bash*: No such file or directory
$ shopt -s dotglob
$ ls *.bash*
.bash_aliases .bash_history .bash_logout .bashrc .bashrc.save
L'eccezione a questo è - come hai già mostrato - quando hai già dichiarato esplicitamente che i file saranno nascosti con uno schema simile .bash*
. Sostituisce semplicemente l' dotglob
impostazione predefinita :
$ shopt -u dotglob # unset dotglob
$ ls .bash*
.bash_aliases .bash_history .bash_logout .bashrc .bashrc.save
Ad ogni modo, oltre a quella stranezza, spero che questo ti aiuti a capire cosa succede sotto la superficie.
Ci sono altre shopt
bandiere che alterano come globbing opere: extglob
, failglob
, globstar
, nocaseglob
e nullglob
. Loro e una serie di altre shopt
bandiere sono documentate come parte del manuale di Bash .
Allo stesso modo, la pagina su Pattern Matching dovrebbe essere di buona lettura.
¹ A meno failglob
che non nullglob
siano impostati.