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.
-
open
Tentativa de abrir o arquivo para gravação (falha: permissão negada) -
lstat
Verifique o dono do arquivo -
getuuid
Verifique o ID do usuário atual para ver se eles correspondem ao proprietário do arquivo -
unlink
Exclua o arquivo (isso é permitido porque a permissão de gravação está no diretório) -
open
Cria um novo arquivo com o mesmo nome -
write
O conteúdo do arquivo (leia antes, eu digitei algumas coisas sem sentido) -
fsync
Flush o arquivo para o disco (não é realmente importante) -
close
-
chmod
Altere as permissões do novo arquivo para se parecer com o antigo - acontece que agora ele tem um novo proprietário.