Você, glen
, é o proprietário do diretório (veja o arquivo .
em sua listagem). Um diretório é apenas uma lista de arquivos e você tem permissão para alterar essa lista (por exemplo, adicionar arquivos, remover arquivos, alterar propriedades para torná-lo seu novamente, etc.). Você pode não ser capaz de alterar os conteúdos do arquivo diretamente, mas você pode ler e desvincular (remover) o arquivo como um todo e adicionar novos arquivos posteriormente. 1 Apenas testemunhando o antes e depois, este pode parecer o arquivo foi alterado.
O Vim usa arquivos de swap e move arquivos em volta da água, então isso explica porque parece escrever no mesmo arquivo que você faz no seu shell, mas não é a mesma coisa. 2
Então, o que o Vim faz se resume a isso:
cat temp > .temp.swp # copy file by contents into a new glen-owned file
echo nope >> .temp.swp # or other command to alter the new file
rm temp && mv .temp.swp temp # move temporary swap file back
1 Esta é uma diferença importante na manipulação de permissões de arquivos entre o Windows e o Unices. No Windows, geralmente não é possível remover arquivos para os quais você não tem permissão de gravação.
2 update: conforme observado nos comentários, o Vim não faz isso dessa maneira para alterar a propriedade, pois o número de inode no arquivo temp
não é alterado (comaring ls -li
antes e depois). Usando strace
, podemos ver exatamente o que o vim
faz. A parte interessante está aqui:
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = -1 EACCES (Permission denied)
unlink("temp") = 0
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 4
write(4, "more text bla\n", 14) = 14
close(4) = 0
chmod("temp", 0664) = 0
Isso mostra que apenas desvincula , mas não fecha o descritor de arquivo para temp
. Em vez disso, apenas sobrescreve todo o seu conteúdo ( more text bla\n
no meu caso). Eu acho que isso explica porque o número do inode não muda.