Siz,, dizininglen
sahibisiniz ( listenizdeki dosyaya bakın ). Bir dizin sadece dosyaların bir listesidir ve bu listeyi değiştirme izniniz vardır (örneğin, dosya ekleme, dosyaları kaldırma, tekrar kendiniz yapmak için sahiplik değiştirme vb.). Sen değiştirmek mümkün olmayabilir içeriğini doğrudan dosyanın ama okuyabilir ve unlink (remove) bir bütün olarak dosya ve sonradan yeni dosyalar ekleyin. 1 Sadece önceki ve sonraki tanıklıklarda, bu dosya değiştirilmiş gibi görünebilir ..
O yüzden açıklıyor böylece Vim, etrafında su altında takas dosya ve hamle dosyalarını kullanır görünüyor size kabuğunda olduğu gibi aynı dosyaya yazma, ama aynı şey değil. 2
Öyleyse, Vim'in yaptığı şeye göre:
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 Bu, Windows ve Unices arasındaki dosya izin işlemlerinde önemli bir farktır. Windows'ta, genellikle yazma izniniz olmayan dosyaları kaldıramazsınız.
2 güncelleme: yorumlarda belirtildiği gibi, Vim, temp
dosyadaki inode numarası değişmediği için ( ls -li
önce ve sonra gelirken ) , sahipliği değiştirmek için bu şekilde yapmaz . Kullanarak strace
tam olarak ne yaptığını görebiliriz vim
. İlginç kısım burada:
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
Bu, yalnızca işaretin kaldırıldığını , ancak dosya tanımlayıcısının kapatılmadığını gösterir temp
. Aksine, sadece tüm içeriğinin üzerine yazar ( more text bla\n
benim durumumda). Sanırım bu inode numarasının neden değişmediğini açıklıyor.
ls -il
önce ve sonratemp
çalışarak olduğunu kontrol edebilirsiniz, aynı isimde farklı bir dosya olduğunu biliyorsunuz.