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]* .