O motivo por trás de ls -a mostrando . e .. não tem nada a ver com o utilitário e tudo a ver com sistemas de arquivos Unix (e Linux).
Tudo é um arquivo.
Diretórios são realmente arquivos que contêm listas de arquivos. "Dentro" qualquer diretório dado, porque essa é a perspectiva do usuário, se não exatamente a perspectiva do sistema de arquivos, existem dois arquivos especiais.
- O primeiro, chamado
., é uma referência ao diretório de trabalho atual. Isso é usado por pessoas quase todos os dias, quando fazem coisas como executar um comando no diretório atual via./scriptname. - O segundo, chamado
.., é uma referência ao diretório pai do CWD. Como.,..é usado todos os dias por todos que desejam alterar os diretórios para o diretório pai por meio decd ...
A chamada do sistema getdents() , que é o cavalo de batalha no lado do sistema de ls , simplesmente enumera todos os arquivos em um diretório. (lembre-se: tudo é um arquivo. dispositivos, diretórios, soquetes, etc., para que todos apareçam)
Do lado do utilitário, o (s) autor (es) do comando ls forneceram várias opções e combinações de opções que nos permitem filtrar certas partes ou tipos de informações, por exemplo, @Gilles comentou acima que ls -A mostrará todos os dotfile, com as exceções de . e .. . Todas essas opções podem ser consideradas opções de pós-processamento. Eles afetam o que é exibido por ls , não o que é encontrado por ls .
Não há realmente nenhuma razão para listar explicitamente . e .. , por padrão, já que todos sabemos que estão lá, para que servem e quando usá-los.
Pode ser útil ser capaz de ter alguma opção para vê-los, quando você estiver solucionando problemas de permissões estranhos.
Confira a página de manual para getdents() ¹. Ele explica um pouco mais sobre como funciona e inclui o código-fonte de um programa de amostra que você pode compilar com gcc -Wall , que lista todos os arquivos em um diretório.
-
1. Pelo menos, a página de manual do Ubuntu para getdents() parece ter o código de exemplo.