As permissões do Unix são um pouco estranhas quando se trata da operação de remoção.
Para começar, excluir um arquivo realmente envolve a remoção do link para o arquivo de um diretório. Como a maioria dos sistemas de arquivos Unix permite links físicos, é possível que o arquivo seja vinculado de mais de um diretório, portanto, existe mais de um link. E quando você remove um link, o arquivo não é excluído, a menos que não existam outros links para ele.
Por esse motivo, a chamada real do sistema usada para "remover" um arquivo é chamada unlink
. No entanto, o utilitário de comando shell que realiza o unlink é chamado de rm
, que é um mnemônico para "remover".
Como a operação de desconexão modifica o diretório (removendo a entrada de diretório) e não o arquivo, a permissão necessária para a operação é a permissão de gravação no diretório . As permissões no próprio arquivo são irrelevantes.
No entanto, como se constata, é um erro comum tentar excluir um arquivo que não pertence a você de um diretório no qual você tem permissão de gravação. (Mais precisamente, a situação não é comum, mas nos casos em que existe, é um pouco comum erroneamente tentar excluir o arquivo.)
Para ajudar a proteger os administradores contra o disparo de seus próprios dedos, o utilitário rm
primeiro verifica se a pessoa que o invocou tem permissão de gravação no arquivo , embora essa permissão não seja necessária para desvincular o arquivo . Por razões óbvias, ele faz essa verificação antes de tentar excluir o arquivo.
O utilitário rm
não verifica se o uso tem permissão para desvincular o arquivo, porque "verificar antes da ação" é geralmente considerado um estilo ruim. Em vez disso, ele executa a ação desejada e relata falha se o sistema operacional retornar um erro. Neste caso, o SO reportará o EACCES porque o usuário não tem acesso de gravação ao diretório.
A conseqüência lamentável é que, se você tentar excluir um arquivo para o qual você não tem permissão de gravação de um diretório no qual você não tem permissão de gravação, rm
preferirá perguntar se deve prosseguir e relatar falha .