Você glen
é o proprietário do diretório (consulte o .
arquivo na 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 a propriedade para torná-lo seu novamente, etc.). Você pode não conseguir alterar o conteúdo do arquivo diretamente, mas pode ler e desvincular (remover) o arquivo como um todo e adicionar novos arquivos posteriormente. 1 Apenas testemunhando o antes e o depois, pode parecer que o arquivo foi alterado.
O Vim usa arquivos de troca e os move debaixo d'água, o que explica por que parece gravar no mesmo arquivo que você faz no shell, mas não é a mesma coisa. 2
Então, o que o Vim faz, resume-se 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 Essa é uma diferença importante no tratamento de permissão de arquivo 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 atualização: conforme observado nos comentários, o Vim não faz isso dessa maneira para alterar a propriedade, pois o número do inode no temp
arquivo não muda (comparação de marcas ls -li
antes e depois). Usando strace
podemos ver exatamente o que 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 ele apenas desassocia , mas não fecha o descritor de arquivo temp
. Em vez disso, apenas substitui todo o seu conteúdo ( more text bla\n
no meu caso). Eu acho que isso explica por que o número do inode não muda.
ls -il
antes e depois ... setemp
o número do inode foi alterado, você sabe que é um arquivo diferente com o mesmo nome.