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.sebelum:
-rw-r--r-- 1 root staff 0 19 Dec 12:38 temp
setelah:
-rw-r--r-- 1 glen staff 7 19 Dec 12:38 temp
Vim tidak menembus penghalang izin. Lihat saja informasi file yang tercantum dengan hati-hati maka Anda bisa mengetahui bahwa vim sebenarnya menghapus file asli (karena Anda memiliki izin untuk menghapus file tersebut meskipun Anda tidak dapat mengubah kontennya) kemudian membuat file baru milik Anda sendiri ( lihat pemilik tidak lagi 'root').
Dan saat Anda mengedit file asli dalam vim, itu memperingatkan bahwa Anda mengubah file read-only. Jadi ketika Anda mengetik perintah
:wq!
(memaksa operasi), yang dapat dilakukan hanya vim adalah menghapus file yang ada dan membuat file baru yang memiliki nama yang sama.Semoga itu bisa membantu.
sumber
Gunakan
-i
opsils
untuk melihat nomor inode, yang merupakan pengidentifikasi unik (dalam sistem file) file atau objek lain.Anda akan melihat bahwa file diganti dengan objek yang berbeda: nomor inode kemungkinan akan berubah.
Melihat nomor inode yang sama bukan bukti apa pun: nomor inode dapat didaur ulang. Jika kami menghapus tautan terakhir ke suatu file, dan kemudian membuat file baru, kami mungkin mendapatkannya dengan nomor inode yang sama. Tapi itu tidak bisa terjadi jika file lama dihapus setelah yang baru dibuat. Misalnya
mv file file.tmp; touch file; rm file.tmp
. Saya menduga vim benar-benar melakukan sesuatu yang analog dengan iniecho new_content > tmpfile; mv tmpfile file
. Themv
operasi akan menerjemahkan kerename
system call, sehingga penugasan nomor inode tergantung pada bagaimana mengimplementasikan filesystem mengubah nama yang menghapus link tujuan.sumber