Not : Eski lisanslama nedenlerinden dolayı, çoğu GNU / Linux dağıtımı, Bill Joy tarafından yazılan orijinal vi programını içermez. Bunun yerine, vi komutu Vim'i vi-uyumluluk modunda çalıştırarak sağlanır. Aşağıdaki cevap, Vim'i vi-uyumluluk moduyla çalıştırmaya dayanmaktadır.
Salt okunur bir dosyayı değiştirme
Vim, salt okunur bir dosyanın arabelleğini değiştirmeleri durumunda kullanıcıyı uyarır W10: Warning: Changing a readonly file
. Kullanıcı bu dosyaya yazmaya çalışırsa, aşağıdaki hata iletisini alır 'readonly' option is set (add ! to override)
.
Üst dizin Vim kullanıcısı tarafından yazılabilir olduğunda
Vim, yardımcı olmak, onlar zorla, bir ünlem işareti ekleyerek yazma ısrar anlamına kullanıcı bildirir !
için w
komuta. Write komutunun bu güçlü sürümü kullanılırsa, Vim orijinal dosyayı siler (yalnızca Vim backup
seçenek kümesi ile Vim kullanılıyorsa , orijinal dosya aslında yedek dosyayla aynı olarak yeniden adlandırılır ). Daha sonra orijinaliyle aynı ada sahip yeni bir dosya açar (oluşturur) ve arabelleğinin içeriğini bu yeni dosyaya yazar. Bu, Vim'i çalıştırmadan önce ve sonra dosyanın inode'unu kontrol ederek gözlemlenebilir :
$ ls -l --inode t
131529 -r--r--r-- 1 anthony anthony 0 Apr 13 09:23 t
$ vi t
$ ls -l --inode t
131649 -r--r--r-- 1 anthony anthony 4 Apr 13 09:23 t
Not: Bu aynı zamanda dosyanın iznini ve sahipliğini ve kopma (sembolik) bağlantılarını da değiştirebilir, örn. Orijinal dosya başka bir kullanıcıya aitse, yeni dosya Vim çalıştıran kullanıcıya ait olacaktır.
Bir işlem yalnızca dosyanın üst dizini için yazma iznine sahipse bunu yapabilir. Genel olarak, bir programın bir dosyayı değiştiremediğinden emin olmak için hem dosyanın hem de üst dizinin izinleri güvence altına alınmalıdır.
Üst dizin Vim kullanıcısı tarafından yazılamadığında
Ancak, bu durumda bile, Vim ısrar eden kullanıcının dosyayı aşırı yazmasına yardımcı olmak için elinden gelenin en iyisini yapar. Vim kullanıcısı dosyanın sahipliğine sahipse, Vim dosyanın iznini geçici olarak değiştirerek ( chmod
sistem çağrısını kullanarak ), arabelleği dosyaya yazarak, dosyayı kapatıp izinleri geri. Vi'yi strace üzerinden çalıştırırken yapılan sistem çağrılarının bir özeti strace -o ../vi.trace vi t
:
getuid() = 501
chmod("t", 0100644) = 0
open("t", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
write(4, "I am good singer,\n", 18) = 18
fsync(4) = 0
close(4) = 0
chmod("t", 0100444) = 0
Not: Vim kullanıcısı sahip olmadığı bir dosyayı düzenliyorsa, Vim dosya izinlerini değiştiremezse bu gerçekleşmez.
ek
Bir dosyanın değiştirilemeyeceğinden emin olmak için (GNU / Linux sisteminde), chattr
komutu süper kullanıcı olarak çalıştırın :
sudo chattr +i filename
Gönderen man chattr
:
'İ' özniteliğine sahip bir dosya değiştirilemez: silinemez veya yeniden adlandırılamaz, bu dosyaya bağlantı oluşturulamaz ve dosyaya veri yazılamaz. Yalnızca süper kullanıcı veya CAP_LINUX_IMMUTABLE özelliğine sahip bir işlem bu özelliği ayarlayabilir veya temizleyebilir.