Yazma iznim olmayan bir dosya nasıl kaydedilir?


26

Bazen bir dosyayı açar [read-only]ve durum satırındaki uyarıyı fark etmeden (yani, bazı rasgele /etcyapılandırma dosyaları gibi /etc/resolv.conf) farketmeden veya "unutmadan" kendi kullanıcım olarak bazı değişiklikler yaparım .

:w!Açıkçası bu durumda benim kullanıcı zaten zaten yazma izni olmadığı için başarısız. Bu yüzden :w /home/filenameçıkmalı ve sudo mv ...çok rahatsız edici olmalıyım .

Açık olan dosyayı kaydedebilmek için geçici olarak kökten çıkmamın bir yolu var mı? (içinde bulunduğumda sudoersveya / ve sudoğrudan yapabilirsem )

Yanıtlar:


24

İşin püf noktası harici bir çağrı yapmaktır sudo:

:w !sudo tee %

Bu nasıl çalışır:

  • :w !<command><command>tamponun içeriği ile stdin olarak çalıştırılır .
  • teestdin dosyasını bir dosyaya kopyalar & stdout; %geçerli dosya adına genişler ..
  • sudoKök izinleri için önek eklersiniz.

Dosyayı gerçekten Vim ile kaydetmiyorsunuz, bunun yerine, düzenlemekte olduğunuz dosyanın içeriğinin üzerine yazmak için harici bir program çağırıyorsunuz. Bu yüzden Vim'den bir uyarı alacaksınız:

W12: Warning: File "xxx" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File: 

Bunu bir işleve dönüştürebilirsiniz:

fun! SuperWrite()
        write !sudo tee %
        " Or with :silent (but that doesn't seem to work for everyone)
        "silent write !sudo tee %
        edit!
endfun

Ve keybind:

nnoremap <Leader>w! :call SuperWrite()<CR>

İle su, yalnızca kök kullanıcı -chemen bir komutu çalıştırmak için kullanabilir . Bunu yapmak için kullanabileceğini sanmıyorum su, ama belki de bilmediğim bir numara var.


SuperWriteçalışır, ancak dosyayı size geri yansıtır. :silentLy çalıştırdığınızda , şifrenizi görünmez olarak girdiniz.
— TankorSmash

@TankorSmash Teşekkürler; cevap güncellendi. Yine de "parolanızı görünmez olarak girin" ile ne kastettiğinizden emin değil misiniz? Ekleme silentiyi iş gibi görünüyor?
— Martin Tournoij

Sudo ile vim'i çalıştırmıyorum, bu yüzden burada çalıyor olabilir, fakat dosyaya sudo girdiğimde sudo şifresini ister. Sessizse, komut istemini göremiyorum, ancak yine de bir şifre girmeniz gerekiyor.
— TankorSmash

1
Gördüğünüz şey, tee'nin verilen dosya kadar stdout'a yankılanmasının standart işlevselliğidir. Bir çözüm stdout komutunu / dev / null, a la dizinine yönlendirmektir: w ! tee % > /dev/null Bu hala komutun sonucunu (tek bir satır) yansıtır, ancak tüm tampon içeriğini değil.
— Jon Carter

Kullanmak yerine teeçıktılarını atmak yerine cat, dosyanın yazdırılmasını istemiyorsanız da işe yaramaz mı?
— Yalan Ryan

12

Kullanacağım .vimrc dosyamda aşağıdaki haritalamayı kullanıyorum:

cnoremap w!! w !sudo tee %

Hatırlamak kolaydır, çünkü w"yazmak" w!, "zorla yazma " dır ve w!!"süper duper-force yazma" dır. : P


1
Uzun zamandır haritalandırdım W, ama w!!çok daha mantıklı geliyor. Thanks
— jalanb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.