Usted, glenes el propietario del directorio (vea el .archivo en su listado). Un directorio es solo una lista de archivos y tiene permiso para modificar esta lista (por ejemplo, agregar archivos, eliminar archivos, cambiar la propiedad para volver a ser suya, etc.). Es posible que no pueda alterar el contenido del archivo directamente, pero puede leer y desvincular (eliminar) el archivo en su conjunto y agregar nuevos archivos posteriormente. 1 Solo presenciando el antes y el después, puede parecer que el archivo ha sido alterado.
Vim utiliza archivos de intercambio y los mueve bajo el agua, lo que explica por qué parece escribir en el mismo archivo que en su shell, pero no es lo mismo. 2
Entonces, lo que hace Vim se reduce a esto:
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 Esta es una diferencia importante en el manejo de permisos de archivos entre Windows y Unices. En Windows, por lo general, uno no puede eliminar archivos para los que no tiene permiso de escritura.
2 actualización: como se señaló en los comentarios, Vim no lo hace de esta manera para cambiar la propiedad, ya que el número de inodo en el temparchivo no cambia (aparece ls -liantes y después). Usando stracepodemos ver exactamente lo que vimhace. La parte interesante está aquí:
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
Esto muestra que solo se desvincula , pero no cierra el descriptor de archivo temp. Simplemente sobrescribe todo su contenido ( more text bla\nen mi caso). Supongo que esto explica por qué el número de inodo no cambia.
ls -ilantes y después ... sitempel número de inodo cambió, sabe que es un archivo diferente con el mismo nombre.