Si abre un archivo en el que no tiene permiso para escribir en vim, luego decide que necesita cambiarlo, puede escribir sus cambios sin salir de vim haciendo :w !sudo tee %
No entiendo cómo puede funcionar esto. ¿Puedes por favor diseccionar esto?
Entiendo la :w
parte, escribe el búfer actual en el disco, suponiendo que ya hay un nombre de archivo asociado, ¿verdad?
También entiendo el !
que ejecuta el sudo tee
comando y %
representa el contenido actual del búfer, ¿verdad?
Pero aún no entiendo cómo funciona esto.
27
tee
?%
representa el nombre de archivo del búfer actual, no su contenido.entonces
:w !sudo tee %
significa canalizar el buffer actual asudo tee [currentfilename]
.tee
se ejecuta como root, por lo que tiene acceso de escritura para guardar su stdin en el archivo.Ver también /programming/2600783/how-does-the-vim-write-with-sudo-trick-work
fuente
¡No del todo bien!
!command
ejecuta el comando como un comando de filtro , que obtiene textostdin
, hace algo y lo envía astdout
.Mediante el uso
w
, que empujó el contenido del archivo astdin
desudo tee %
.%
es un registro especial en vim, que contiene el nombre del archivo actual.Entonces tienes
sudo tee FILENAME
, que empujarátee
stdin
el contenido del archivo al archivo actual.fuente
:!command
es un filtro (cf.:h !
), mientras:w !command
que no lo es, solo se ejecutacommand
con el archivo actual comostdin
(cf.:h :w_c
). A saber::w !sed /./d
no cambia el contenido del búfer actual. Pero la receta es de hecho no está bien por otra razón,%
necesita ser escapado::exec 'w !sudo tee ' . shellescape(expand('%', 1))
. El comando original no funciona con, por ejemplo, nombres de archivo con espacios.