Eu posso ver que seu caminho atual é ~ , o diretório inicial do seu usuário. Você deve ter permissões de gravação para esse diretório.
Pense nisso de outra forma - se você leu e gravou permissões no diretório, o que impede você de copiar o arquivo, excluir o antigo e renomear o novo com permissões diferentes?
Isso é exatamente o que o vim faz!
Se você executar o vim sob strace, por exemplo:
open("testfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = -1 EACCES (Permission denied)
lstat("testfile", {st_mode=S_IFREG|0644, st_size=10, ...}) = 0
getuid() = 1000
unlink("testfile") = 0
open("testfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 3
write(3, "ffjidfjds\n", 10) = 10
fsync(3) = 0
close(3) = 0
chmod("testfile", 0644) = 0
Com base nesse log, posso adivinhar o seguinte processo:
Algumas verificações de permissão anteriores (e chown tentativas, etc.) são omitidas por brevidade.
-
openTentativa de abrir o arquivo para gravação (falha: permissão negada) -
lstatVerifique o dono do arquivo -
getuuidVerifique o ID do usuário atual para ver se eles correspondem ao proprietário do arquivo -
unlinkExclua o arquivo (isso é permitido porque a permissão de gravação está no diretório) -
openCria um novo arquivo com o mesmo nome -
writeO conteúdo do arquivo (leia antes, eu digitei algumas coisas sem sentido) -
fsyncFlush o arquivo para o disco (não é realmente importante) -
close -
chmodAltere as permissões do novo arquivo para se parecer com o antigo - acontece que agora ele tem um novo proprietário.