Lorsque vous effectuez ls *
le, vous êtes en *
train de le développer avant de le passer à ls
. C'est-à-dire si nous avons trois fichiers ( a
, b
et c
) dans un répertoire ls *
en cours d'exécution ls a b c
.
Lorsque Bash ne peut pas se développer, il passe à travers la chaîne brute¹. C'est pourquoi vous voyez les caractères génériques dans l'erreur, ainsi qu'un message introuvable. ls
essayé d'afficher la liste d'un fichier appelé littéralement *.bash*
.
Alors pourquoi cela ne s'est-il pas étendu? Eh bien, par défaut, le globbing (ce que cette extension générique est appelée) ne retournera pas les fichiers cachés. Vous pouvez changer cela avec shopt -s dotglob
(cela ne persistera pas à moins que vous ne le colliez dans votre .bashrc
- il peut être désactivé par défaut pour une bonne raison, alors soyez prudent), voici une démo rapide:
$ 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'exception à cela est - comme vous l'avez déjà montré - lorsque vous avez déjà déclaré explicitement que les fichiers seront masqués avec un modèle comme .bash*
. Il remplace simplement le dotglob
paramètre par défaut :
$ shopt -u dotglob # unset dotglob
$ ls .bash*
.bash_aliases .bash_history .bash_logout .bashrc .bashrc.save
Quoi qu'il en soit, outre cette bizarrerie, j'espère que cela vous aidera à comprendre ce qui se passe sous la surface.
Il existe d' autres shopt
drapeaux qui modifient la façon dont fonctionne englobement: extglob
, failglob
, globstar
, nocaseglob
et nullglob
. Eux et un tas d'autres shopt
drapeaux sont documentés dans le cadre du manuel Bash .
De même, la page sur la correspondance de motifs devrait permettre une bonne lecture.
¹ Sauf si failglob
ou nullglob
sont définis.