No início do sistema de arquivos Unix (pelo menos nos dias V7, por volta de 1970) os diretórios foram implementados como arquivos especiais e somente o root poderia usar a chamada de sistema mknod(2)
que os criou e somente root poderia unlink(2)
arquivo.
Essas proteções estavam no lugar para manter a estrutura do sistema de arquivos consistente. Por exemplo, se um usuário tiver permissão para gravar em um arquivo especial de diretório, ele poderá tornar seu diretório pai ..
point para ele mesmo (especificamente seu próprio nó i). Isso criaria uma referência circular no sistema de arquivos que seria uma Coisa Ruim. É claro que existem outras inconsistências que podem ser feitas, isto é apenas um exemplo claro.
A consistência foi mantida pelos programas de espaço do usuário, como mkdir(1)
e rmdir(1)
, que eram a raiz do Set-UID para que pudessem fazer as chamadas de sistema privilegiadas em nome de um usuário não privilegiado. Quando a recursão foi incluída em rm(1)
, o comando remove será executado como o UID atual e, em seguida, chamará rmdir(1)
exclusivamente para remover diretórios vazios. Este ainda é um método bastante padrão de elevação de permissão: não use mais permissões do que o necessário.
Algum tempo depois, mkdir(2)
e rmdir(2)
foram adicionados como suas próprias chamadas de sistema, mas a relação entre rm(1)
e rmdir(1)
permanece.
Pessoalmente, acho um pouco mais satisfatório para rmdir junk
e sei que o pior que fiz foi remover um diretório vazio.