Muchos de ustedes probablemente hayan visto el comando que les permite escribir en un archivo que necesita permiso de root, incluso cuando olvidaron abrir vim con sudo:
:w !sudo tee %
Lo que pasa es que no entiendo exactamente lo que está sucediendo aquí.
Ya he imaginado esto:
w
es para esto
*:w_c* *:write_c*
:[range]w[rite] [++opt] !{cmd}
Execute {cmd} with [range] lines as standard input
(note the space in front of the '!'). {cmd} is
executed like with ":!{cmd}", any '!' is replaced with
the previous command |:!|.
entonces pasa todas las líneas como entrada estándar.
La !sudo tee
parte llama tee
con privilegios de administrador.
Para que todo tenga sentido, %
deberían mostrar el nombre de archivo (como parámetro para tee
), pero no puedo encontrar referencias sobre la ayuda para este comportamiento.
tl; dr ¿Podría alguien ayudarme a diseccionar este comando?
sudo
se aplica a cat
, pero no a >
, por lo que no está permitido. Puede intentar ejecutar todo el comando en una subshell sudo, como :w !sudo sh -c "cat % > yams.txt"
, pero eso tampoco funcionará, porque en la subshell, %
es nulo; Vaciará el contenido de su archivo.
:w !sudo sh -c "cat >%"
realidad funciona tan bien como sudo tee %
porque Vim sustituye el nombre del archivo %
antes de que llegue a la subshell. Sin embargo, ninguno de ellos funciona si el nombre de archivo tiene espacios; tienes que hacer :w !sudo sh -c "cat >'%'"
o :w !sudo tee "%"
arreglar eso.
:w !sudo cat > %
No funcionaría tan bien y no contaminaría la producción estándar?