Usted, glen
es 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 temp
archivo no cambia (aparece ls -li
antes y después). Usando strace
podemos ver exactamente lo que vim
hace. 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\n
en mi caso). Supongo que esto explica por qué el número de inodo no cambia.
ls -il
antes y después ... sitemp
el número de inodo cambió, sabe que es un archivo diferente con el mismo nombre.