Ty glen
jesteś właścicielem katalogu (zobacz .
plik we wpisie). Katalog jest tylko listą plików i masz uprawnienia do zmiany tej listy (np. Dodawania plików, usuwania plików, zmiany własności, aby znów była twoja itp.). Możesz nie być w stanie bezpośrednio zmienić zawartości pliku, ale możesz przeczytać i odłączyć (usunąć) plik jako całość, a następnie dodać nowe pliki. 1 Obserwując tylko przed i po, może to wyglądać, jakby plik został zmieniony.
Vim używa plików wymiany i przenosi pliki pod wodą, więc to wyjaśnia, dlaczego wydaje się zapisywać w tym samym pliku, co w powłoce, ale to nie to samo. 2)
Zatem to, co robi Vim, sprowadza się do tego:
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 Jest to ważna różnica w obsłudze uprawnień do plików między Windows a Uniksem. W systemie Windows zwykle nie można usunąć plików, dla których nie masz uprawnień do zapisu.
Aktualizacja 2 : jak zauważono w komentarzach, Vim tak naprawdę nie robi tego w celu zmiany własności, ponieważ numer i-węzła w temp
pliku nie zmienia się (porównywanie ls -li
przed i po). Za pomocą strace
możemy zobaczyć dokładnie, co vim
robi. Interesująca część jest tutaj:
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
To pokazuje, że tylko rozłącza , ale nie zamyka deskryptora pliku temp
. Raczej po prostu nadpisuje całą zawartość ( more text bla\n
w moim przypadku). Myślę, że to wyjaśnia, dlaczego numer i-węzła się nie zmienia.
ls -il
przed i po ... jeślitemp
numer i-węzła ulegnie zmianie, wiesz, że jest to inny plik o tej samej nazwie.