Sei glen
il proprietario della directory (vedi il .
file nella tua scheda). Una directory è solo un elenco di file e hai il permesso di modificare questo elenco (ad es. Aggiungere file, rimuovere file, cambiare proprietà per renderlo tuo di nuovo, ecc.). Potrebbe non essere possibile modificare direttamente il contenuto del file, ma è possibile leggere e scollegare (rimuovere) il file nel suo insieme e aggiungere nuovi file successivamente. 1 Solo testimoniando il prima e il dopo, questo può sembrare che il file sia stato modificato.
Vim usa i file di scambio e sposta i file sott'acqua, quindi questo spiega perché sembra scrivere nello stesso file che hai nella shell, ma non è la stessa cosa. 2
Quindi, ciò che fa Vim, si riduce a questo:
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 Questa è una differenza importante nella gestione delle autorizzazioni dei file tra Windows e Unices. In Windows, di solito non è possibile rimuovere file per i quali non si dispone dell'autorizzazione di scrittura.
2 aggiornamento: come notato nei commenti, Vim non lo fa in questo modo per cambiare la proprietà, poiché il numero di inode sul temp
file non cambia (comaring ls -li
prima e dopo). Usando strace
possiamo vedere esattamente cosa vim
fa. La parte interessante è qui:
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
Ciò mostra che scollega solo , ma non chiude il descrittore di file temp
. Piuttosto sovrascrive solo i suoi contenuti ( more text bla\n
nel mio caso). Immagino che questo spieghi perché il numero di inode non cambia.
ls -il
prima e dopo ... setemp
il numero di inode è cambiato, sai che è un file diverso con lo stesso nome.