Quando você faz ls *
, o *
está sendo expandido antes , ele é passado para ls
. Ou seja, se temos três arquivos ( a
, b
e c
) em um diretório ls *
está realmente executando ls a b c
.
Quando o Bash não pode se expandir, ele passa pela string raw¹. É por isso que você vê os curingas no erro, junto com uma mensagem não encontrada. ls
tentou mostrar a listagem de um arquivo chamado literalmente *.bash*
.
Então por que isso não se expandiu? Bem, por padrão globbing (o que esta expansão curinga é chamado) não retornará arquivos ocultos. Você pode mudar isso com shopt -s dotglob
(que não persistirá a menos que você o coloque no seu .bashrc
- ele pode estar desabilitado por padrão por um bom motivo, então tenha cuidado com isso), aqui está uma demonstração rápida:
$ 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
A exceção a isso é, como você já mostrou, quando já declarou explicitamente que os arquivos ficarão ocultos com um padrão como .bash*
. Ele simplesmente substitui a configuração padrão dotglob
:
$ shopt -u dotglob # unset dotglob
$ ls .bash*
.bash_aliases .bash_history .bash_logout .bashrc .bashrc.save
De qualquer forma, além dessa peculiaridade, espero que isso ajude você a entender o que está acontecendo abaixo da superfície.
Existem outros shopt
sinalizadores que alteram o funcionamento da globalização: extglob
, failglob
, globstar
, nocaseglob
e nullglob
. Eles e uma série de outros shopt
sinalizadores são documentados como parte do manual do Bash .
Da mesma forma, a página em Correspondência de padrões deve facilitar a leitura .
¹ A menos que failglob
ou nullglob
estejam definidos.