Molti di voi hanno probabilmente visto il comando che consente di scrivere su un file che necessita dell'autorizzazione di root, anche quando si è dimenticato di aprire vim con sudo:
:w !sudo tee %
Il fatto è che non capisco cosa sta succedendo esattamente qui.
Ho già capito questo:
wè per questo
*: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 |:!|.
quindi passa tutte le linee come input standard.
La !sudo teeparte chiama teecon privilegi di amministratore.
Perché tutti abbiano un senso, %dovrebbero generare il nome del file (come parametro per tee), ma non riesco a trovare riferimenti sull'aiuto per questo comportamento.
tl; dr Qualcuno potrebbe aiutarmi a dissezionare questo comando?
sudoviene applicato a cat, ma non a >, quindi non è consentito. Potresti provare a eseguire l'intero comando in una subshell sudo, come :w !sudo sh -c "cat % > yams.txt", ma non funzionerà neanche, perché nella subshell %è zero; cancellerai il contenuto del tuo file.
:w !sudo sh -c "cat >%"realtà funziona altrettanto bene sudo tee %perché Vim sostituisce il nome del file %prima che arrivi alla subshell. Tuttavia, nessuno dei due funziona se il nome file contiene spazi; devi fare :w !sudo sh -c "cat >'%'"o :w !sudo tee "%"aggiustarlo.
:w !sudo cat > %non funzionerebbe altrettanto bene e non inquinerebbe l'output standard?