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 :w
partie, 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 tee
commande et %
représente le contenu du tampon actuel, n'est-ce pas?
Mais je ne comprends toujours pas comment cela fonctionne.
27
tee
?%
représente le nom de fichier du tampon actuel, pas son contenu.:w !sudo tee %
signifie donc diriger le tampon actuel verssudo 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
la source
Pas tout à fait juste!
!command
exécute la commande en tant que commande de filtrage , qui obtient le texte destdin
, fait quelque chose et le produitstdout
.En utilisant
w
, vous avez poussé le contenu du fichier versstdin
ofsudo tee %
.%
est un registre spécial dans vim, qui contient le nom du fichier actuel.Vous avez donc obtenu
sudo tee FILENAME
, ce qui pousseratee
stdin
- le contenu du fichier - vers le fichier actuel.la source
:!command
est un filtre (cf.:h !
), alors qu'il:w !command
ne l'est pas, il s'exécute simplementcommand
avec le fichier courant commestdin
(cf.:h :w_c
). À savoir::w !sed /./d
ne 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.