Anda,, glen
adalah pemilik direktori (lihat .
file dalam daftar Anda). Direktori hanyalah daftar file dan Anda memiliki izin untuk mengubah daftar ini (mis. Menambah file, menghapus file, mengubah kepemilikan untuk menjadikannya milik Anda lagi, dll.). Anda mungkin tidak dapat mengubah konten file secara langsung, tetapi Anda dapat membaca dan memutuskan tautan file tersebut secara keseluruhan dan kemudian menambahkan file baru. 1 Hanya menyaksikan sebelum dan sesudah, ini mungkin terlihat seperti file telah diubah.
Vim menggunakan file swap dan memindahkan file di bawah air, sehingga itu menjelaskan mengapa tampaknya menulis ke file yang sama seperti yang Anda lakukan di shell Anda, tetapi itu bukan hal yang sama. 2
Jadi, apa yang Vim lakukan, sampai pada ini:
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 Ini adalah perbedaan penting dalam penanganan izin file antara Windows dan Unices. Di Windows, seseorang biasanya tidak dapat menghapus file yang Anda tidak memiliki izin untuk menulis.
2 pembaruan: seperti yang tercantum dalam komentar, Vim tidak benar-benar melakukannya dengan cara ini untuk mengubah kepemilikan, karena nomor inode pada temp
file tidak berubah (comaring ls -li
sebelum dan sesudah). Menggunakan strace
kita dapat melihat apa yang vim
terjadi. Bagian yang menarik ada di sini:
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
Ini menunjukkan bahwa itu hanya memutuskan tautan , tetapi tidak menutup deskriptor file temp
. Agak hanya menimpa seluruh isinya ( more text bla\n
dalam kasus saya). Saya kira ini menjelaskan mengapa nomor inode tidak berubah.
ls -il
sebelum dan sesudah ... jikatemp
nomor inode berubah, Anda tahu itu file yang berbeda dengan nama yang sama.