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 tee
parte chiama tee
con 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?
sudo
viene 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?