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.