Muitos de vocês provavelmente já viram o comando que permite gravar em um arquivo que precisa de permissão root, mesmo quando você esqueceu de abrir o vim com o sudo:
:w !sudo tee %
O problema é que eu não entendo exatamente o que está acontecendo aqui.
Eu já percebi isso:
w
é para isso
*: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 |:!|.
então passa todas as linhas como entrada padrão.
A !sudo tee
parte chama tee
com privilégios de administrador.
Para que todos façam sentido, o %
deve exibir o nome do arquivo (como parâmetro para tee
), mas não consigo encontrar referências na ajuda para esse comportamento.
tl; dr Alguém poderia me ajudar a dissecar esse comando?
sudo
é aplicado a cat
, mas não a >
, portanto, não é permitido. Você pode tentar executar o comando inteiro em um subshell sudo, como :w !sudo sh -c "cat % > yams.txt"
, mas isso também não funcionará, porque no subshell, %
é nulo; você esvaziará o conteúdo do seu arquivo.
:w !sudo sh -c "cat >%"
realmente funciona tão bem quanto sudo tee %
porque o Vim substitui o nome do arquivo %
antes que ele chegue ao subshell. No entanto, nenhum deles funcionará se o nome do arquivo tiver espaços; você tem que fazer :w !sudo sh -c "cat >'%'"
ou :w !sudo tee "%"
consertar isso.
:w !sudo cat > %
Não funcionaria tão bem e não poluiria a saída padrão?