Por padrão, bash (o shell) não expande um nome de arquivo começando com um ponto (considerado um arquivo oculto) a menos que o ponto seja explicitamente especificado. Como [.]
é um padrão, em vez de um caractere literal, ele não aciona a exibição de arquivos ocultos e, portanto, ls -d [.][!.]?*
não corresponde a nada.
Você pode alterar esse comportamento padrão executando shopt -s dotglob
, que define a opção para sempre incluir arquivos ocultos ao expandir os padrões de nome de arquivo (conhecidos como "globbing").
Exemplo (o cifrão no início da linha indica o prompt do shell; não digite-o):
$ touch .foo
$ ls -d .[!.]?*
.foo
$ ls -d [.][!.]?*
ls: cannot access [.][!.]?*: No such file or directory
$ shopt -s dotglob
$ ls -d [.][!.]?*
.foo
O problema com echo [D]
é que a expansão não acontece se nenhum nome de arquivo for correspondido. Como você não tinha um arquivo chamado D
quando tentou, echo
foi dado e ecoou o que você digitou literalmente.
Um exemplo de expansão de nome de caminho que ocorre apenas quando um nome de arquivo corresponde a:
$ touch apple
$ echo a*
apple
$ rm apple
$ echo a*
a*
Se você excluir todos os arquivos que correspondem a [D]*
, echo [D]*
fornecerá [D]*
.