Ви, glen
власник каталогу (див. .
Файл у вашому списку). Каталог - це лише список файлів, і ви маєте дозвіл на зміну цього списку (наприклад, додайте файли, видаліть файли, змініть право власності, щоб зробити його знову вашим тощо). Можливо, ви не зможете безпосередньо змінити вміст файлу, але ви можете прочитати та від’єднати (видалити) файл у цілому та додати нові файли згодом. 1 Тільки спостерігаючи до і після, це може виглядати так, що файл був змінений.
Vim використовує файли swap і переміщує файли під водою, так що це пояснює, чому, здається, записується в той самий файл, що і у вашій оболонці, але це не те саме. 2
Отже, що робить Вім, зводиться до цього:
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 Це важлива різниця в обробці дозволів на файли між Windows та Unices. У Windows зазвичай не вдається видалити файли, на які ви не маєте дозволу на запис.
2 оновлення: як зазначено в коментарях, Vim насправді не робить це так, щоб змінити право власності, оскільки номер inode у temp
файлі не змінюється (порівняння ls -li
до і після). Використовуючи strace
ми можемо бачити, що саме vim
робить. Цікава частина тут:
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
Це показує, що він лише від’єднує посилання , але не закриває дескриптор файлу temp
. Він швидше переписує весь вміст ( more text bla\n
в моєму випадку). Я думаю, це пояснює, чому номер inode не змінюється.
ls -il
до і після ... якщоtemp
номер inode змінився, ви знаєте, що це інший файл з тим же ім'ям.