Vim Read‑only speichern

Juni 6, 2012·
Julio Batista Silva
Julio Batista Silva
· 1 Min Lesezeit

Nach längerem Editieren von /etc/httpd/httpd.conf merkte ich: als normaler User gestartet, keine Schreibrechte (E212: Can't open file for writing).

Klar, man könnte in eine Kopie speichern und mit sudo mv ersetzen – aber es geht einfacher.

Lösung direkt aus Vim: :w !sudo tee %

Vim meldet (W12), dass die Datei geändert wurde und neu geladen werden soll. Mit L neu laden.

Warum funktioniert das?

Aus :help und man tee:

  • :w[rite] {file} – schreibt den Buffer in {file}
  • !{cmd} – führt {cmd} in der Shell aus
  • tee [FILE] – liest von stdin und schreibt nach FILE/stdout
  • % – referenziert die aktuelle Datei

Wir pipen den Buffer nach sudo tee %, das als Root in die aktuelle Datei schreibt.

Weitere Varianten (vgl. commandlinefu):

  • :%!sudo tee %
  • :w !sudo tee > /dev/null %
  • command W :execute ':silent w !sudo tee % > /dev/null' | :edit!
  • :w !pfexec tee %

Neovim

(Abschnitt ergänzt im März 2024)

Der Tipp oben funktioniert in Neovim nicht (siehe https://github.com/neovim/neovim/issues/1716).

Es gibt Plugins als Lösung. Ich nutze Suda: https://github.com/lambdalisue/suda.vim.

Es stellt :SudaWrite und :SudaRead bereit, um Dateien mit erhöhten Rechten zu schreiben/lesen.


Julio Batista Silva
Autoren
Senior Cloud-Entwickler
comments powered by Disqus