Como @Rob já mencionado , você só pode fazer isso se tiver acesso de gravação ao diretório que contém o arquivo. A tentativa de fazer a mesma coisa em um arquivo, por exemplo, /etc
falhará.
Quanto a como vim
está fazendo isso, ele exclui o arquivo e o recria. Para testar isso, criei um arquivo de propriedade do root:
echo foo | sudo tee fff
Em seguida, continuei a editar o arquivo com vim
da maneira que você descreve, mas anexando o processo a strace
para ver o que está acontecendo:
strace vim fff 2> strace.out
Em seguida, verifiquei strace.out
e encontrei:
unlink("fff") = 0
open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
write(4, "foasdasdao\n", 11) = 11
Assim, o arquivo foi excluído primeiro ( unlink("fff")
), então um novo arquivo com o mesmo nome foi criado ( open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644)
) e as modificações que eu fiz foram gravadas nele ( write(4, "foasdasdao\n", 11)
). Se você tentar isso em casa, verá que depois de editá-lo com vim
, o arquivo agora pertencerá a você e não ao root.
Então, estritamente falando, vim
não está editando um arquivo para o qual você não tem acesso de gravação. Ele está excluindo um arquivo de um diretório para o qual você possui acesso de gravação e, em seguida, criando um novo arquivo para o qual, novamente, você tem acesso de gravação.