Quando você faz, ls *
o *
está sendo expandido antes de ser passado para ls
. Ou seja, se temos três arquivos ( a
, b
e c
) em um diretório ls *
está realmente em execução ls a b c
.
Quando o Bash não pode se expandir, ele passa pela cadeia bruta¹. É 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 globbing padrão (como essa expansão de curinga é chamada) não retornará arquivos ocultos. Você pode alterar isso com shopt -s dotglob
(que não persistirá, a menos que você o cole no seu .bashrc
- ele pode ser desativado por padrão por um bom motivo, portanto, tenha cuidado) - 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 serão ocultados com um padrão semelhante .bash*
. Ele simplesmente substitui a dotglob
configuração padrão :
$ 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 sob a superfície.
Há outras shopt
bandeiras que alteram como englobamento obras: extglob
, failglob
, globstar
, nocaseglob
e nullglob
. Eles e uma série de outras shopt
bandeiras são documentados como parte do manual do Bash .
Da mesma forma, a página Correspondência de padrões deve proporcionar uma boa leitura.
¹ A menos que failglob
ou nullglob
estão definidos.