Quando si esegue ls *l' *è in fase di espansione , prima si passa alla ls. Vale a dire se abbiamo tre file ( a, be 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. lsho 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' dotglobimpostazione 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 shoptbandiere che alterano come globbing opere: extglob, failglob, globstar, nocaseglobe nullglob. Loro e una serie di altre shoptbandiere sono documentate come parte del manuale di Bash .
Allo stesso modo, la pagina su Pattern Matching dovrebbe essere di buona lettura.
¹ A meno failglobche non nullglobsiano impostati.