Eu corri vim
usando strace
. Eu criei um arquivo em / tmp chamado "abc" com o conteúdo "foo", configurei somente leitura ( chmod 400 abc
), abri em vim
( strace -o vim.log vim abc
) e salvei usando ": wq!". / p>
Aqui está o strace
log:
...
getcwd("/tmp", 4096) = 5
write(1, "[?25l\"abc\"", 11) = 11
stat("abc", {st_mode=S_IFREG|0400, st_size=4, ...}) = 0
getxattr("abc", "system.posix_acl_access", 0x7fff5725fd60, 132) = -1 ENODATA (No data available)
stat("abc", {st_mode=S_IFREG|0400, st_size=4, ...}) = 0
getuid() = 1000
chmod("abc", 0100600) = 0
open("abc", O_WRONLY|O_CREAT|O_TRUNC, 0600) = 9
write(9, "foo\n", 4) = 4
fsync(9) = 0
close(9) = 0
chmod("abc", 0100400) = 0
setxattr("abc", "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x04\x00\xff\xff\xff\xff\x04\x00\x00\x00\xff\xff\xff\xff \x00\x00\x00\xff\xff\xff\xff", 28, 0) = 0
...
Podemos ver que vim
chama stat
para obter a permissão atual, então o equivalente a chmod(u+w)
, depois a gravação, depois restaura as permissões originais (nesse caso, chmod(400)
).