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 teeparte chama teecom 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?