Come funziona `: w! Sudo tee%`


27

Se apri un file su cui non hai il permesso di scrivere in VIM, quindi decidi che devi cambiarlo, puoi scrivere le tue modifiche senza uscire da VIM facendo :w !sudo tee %
Non capisco come possa funzionare. Puoi per favore dissezionare questo?
Capisco la :wparte, scrive il buffer corrente su disco, supponendo che sia già associato un nome file, giusto?
Capisco anche ciò !che esegue il sudo teecomando e %rappresenta il contenuto del buffer corrente giusto?
Ma ancora non capisco come funziona.

Risposte:


30

La struttura :w !cmdsignifica "scrivere il buffer corrente inviato tramite comando". Quindi, ad esempio, puoi farlo :w !cate verrà reindirizzato al buffer cat.

Ora %è il nome file associato al buffer

Quindi :w !sudo tee %eseguirà il pipe del contenuto del buffer sudo tee FILENAME. Questo scrive efficacemente il contenuto del buffer nel file.


E cos'è tee?
CodyBugstein


2

Non proprio!

!commandesegue il comando come comando di filtro , da cui ricava il testo stdin, fa qualcosa e l'output stdout.

Usando w, hai spinto il contenuto del file su stdindi sudo tee %. %è un registro speciale in vim, che contiene il nome del file corrente.

Quindi hai sudo tee FILENAME, che spingerà tee stdin- contenuto del file - al file corrente.


2
:!commandè un filtro (cfr. :h !), mentre :w !commandnon lo è, viene semplicemente eseguito commandcon il file corrente come stdin(cfr :h :w_c.). In parole povere: :w !sed /./dnon modifica il contenuto del buffer corrente. Ma la ricetta è davvero non è giusto per un altro motivo, %deve essere sfuggito: :exec 'w !sudo tee ' . shellescape(expand('%', 1)). Il comando originale non funziona con, per esempio, i nomi di file con spazi.
Satō Katsura,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.