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, tempdosyadaki 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 stracetam 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\nbenim 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.