Comment fonctionne `: w! Sudo tee%`

27

Si vous ouvrez un fichier sur lequel vous n'êtes pas autorisé à écrire dans vim, puis décidez que vous devez le modifier, vous pouvez écrire vos modifications sans quitter vim en faisant :w !sudo tee %
Je ne comprends pas comment cela peut fonctionner. Pouvez-vous disséquer cela?
Je comprends la :wpartie, il écrit le tampon actuel sur le disque, en supposant qu'il y a déjà un nom de fichier qui lui est associé, non?
Je comprends également !qui exécute la sudo teecommande et %représente le contenu du tampon actuel, n'est-ce pas?
Mais je ne comprends toujours pas comment cela fonctionne.

Ali
la source

Réponses:

30

La structure des :w !cmdmoyens « écrire le tampon courant acheminé par la commande ». Ainsi, vous pouvez le faire, par exemple, :w !catet il dirigera le tampon cat.

Le nom de fichier% est maintenant associé au tampon

Il en :w !sudo tee %sera de même pour le contenu du tampon sudo tee FILENAME. Cela écrit efficacement le contenu du tampon dans le fichier.

Stephen Harris
la source
Et c'est quoi tee?
CodyBugstein Il y a
7

% représente le nom de fichier du tampon actuel, pas son contenu.

:w !sudo tee %signifie donc diriger le tampon actuel vers sudo tee [currentfilename].

tee est exécuté en tant que root, a donc un accès en écriture pour enregistrer son stdin dans le fichier.

Voir aussi /programming/2600783/how-does-the-vim-write-with-sudo-trick-work

cas
la source
2

Pas tout à fait juste!

!commandexécute la commande en tant que commande de filtrage , qui obtient le texte de stdin, fait quelque chose et le produit stdout.

En utilisant w, vous avez poussé le contenu du fichier vers stdinof sudo tee %. %est un registre spécial dans vim, qui contient le nom du fichier actuel.

Vous avez donc obtenu sudo tee FILENAME, ce qui poussera tee stdin- le contenu du fichier - vers le fichier actuel.

cuonglm
la source
2
:!commandest un filtre (cf. :h !), alors qu'il :w !commandne l'est pas, il s'exécute simplement commandavec le fichier courant comme stdin(cf. :h :w_c). À savoir: :w !sed /./dne change pas le contenu du tampon actuel. Mais la recette est en effet pas tout à fait raison pour une autre raison, %doit être échappé: :exec 'w !sudo tee ' . shellescape(expand('%', 1)). La commande d'origine ne fonctionne pas avec, par exemple, les noms de fichiers avec des espaces.
Satō Katsura