1410 votes

Comment fonctionne l’astuce de « Ecrire avec sudo » vim ?

Beaucoup d'entre vous ont probablement vu la commande qui permet d'écrire sur un fichier qui a besoin de la racine de l'autorisation, même lorsque vous avez oublié d'ouvrir vim avec sudo:

:w !sudo tee %

Le truc c'est que je ne comprends pas ce qui est exactement ce qui se passe ici.

J'ai déjà pensé à ceci: w est pour cette

                                                        *: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 |:!|.

ainsi il passe toutes les lignes en entrée standard.

L' !sudo tee partie tee avec des privilèges d'administrateur.

Pour tous les sens, l' % devrait sortir le nom de fichier (comme un paramètre pour tee), mais je ne peux pas trouver des références sur l'aide pour ce problème.

tl;dr quelqu'un Pourrait-il m'aider à disséquer cette commande?

1610voto

Nathan Long Points 30303

% "signifie" le fichier en cours"

Comme eugène y a souligné, % "signifie "le nom du fichier en cours". Une autre utilisation de ce dans Vim est dans la substitution de commandes. Par exemple, :%s/foo/bar "signifie"dans le fichier actuel, remplacer les occurrences de foo par bar." Si vous mettez du texte avant de taper :s, vous verrez que les lignes en surbrillance prendre la place de % que votre substitution de gamme.

:w n'est pas mise à jour de votre fichier

Une partie confuse de cette astuce est que vous pourriez penser, :w , c'est de modifier votre fichier, mais il ne l'est pas. Si vous avez ouvert et modifié file1.txt, puis a couru :w file2.txt, il serait un "enregistrer sous"; file1.txt ne serait pas modifié, mais le contenu de la mémoire tampon devra être envoyé à file2.txt.

Au lieu de file2.txt, vous pouvez remplacer une commande shell pour recevoir le contenu de la mémoire tampon. Par exemple, :w !cat va juste afficher le contenu.

Si Vim n'était pas courir avec sudo accès, de son :w ne pouvez pas modifier un fichier protégé, mais si elle passe le contenu de la mémoire tampon à la coque, une commande dans le shell peut être exécuté avec sudo. Dans ce cas, nous utilisons tee.

La compréhension de tee

Comme pour tee, à l'image de l' tee commande un T-en forme de pipe normale dans un bash de la tuyauterie de la situation: il dirige la sortie vers le fichier spécifié(s) et aussi envoie sur la sortie standard, qui peut être capturée par la prochaine canalisations de commande.

Par exemple, en ps -ax | tee processes.txt | grep 'foo', la liste des processus sera écrit dans un fichier texte et transmis grep.

     +-----------+    tee     +------------+
     |           |  --------  |            |
     | ps -ax    |  --------  | grep 'foo' |
     |           |     ||     |            |
     +-----------+     ||     +------------+
                       ||   
               +---------------+
               |               |
               | processes.txt |
               |               |
               +---------------+

(Diagramme créé avec Asciiflow.)

Voir le tee page de manuel pour plus d'info.

Té comme un hack

Dans la situation de votre question décrit, à l'aide de tee est un hack parce que nous sommes en ignorant la moitié de ce qu'il fait. sudo tee écrit à notre fichier et envoie le contenu de la mémoire tampon de sortie standard, mais nous ignorons la sortie standard. Nous n'avons pas besoin de passer quelque chose à l'autre, les canalisations de commande dans ce cas; nous sommes juste à l'aide de tee comme une alternative de l'écriture d'un fichier et que nous pouvons appeler avec des sudo.

Faire cette astuce facile

Vous pouvez ajouter ceci à votre .vimrc à faire ce truc facile à utiliser: il suffit de taper :w!!.

" Allow saving of files as sudo when I forgot to start vim using sudo.
cmap w!! w !sudo tee > /dev/null %

L' > /dev/null partie explicitement jette la sortie standard, puisque, comme je l'ai dit, nous n'avons pas besoin de passer quelque chose à l'autre, les canalisations de commande.

99voto

eugene y Points 37378
<p>De <code></code> :<pre><code></code></pre><p>C’est pourquoi la commande vim exécute devient <code></code> . Il prend le contenu du fichier édité dans vim et écrit dans le fichier tout en étant root.</p><p>Si vous utilisez souvent l’astuce, vous pouvez ajouter ce raccourci à votre. <code></code> :</p><pre><code></code></pre><p>Ensuite, utilisez <code></code> pour écrire le fichier.</p></p>

19voto

feihu Points 573
<p>Cela fonctionne aussi bien :<pre><code></code></pre><p>C’est inspiré par le commentaire de @Nathan Long.</p><p><strong>Avis</strong>:</p><p><code></code>doit être utilisé au lieu de <code></code> parce que nous voulons <code></code> à décompresser avant leur passage dans la coquille.</p></p>

18voto

kev Points 41855

:w - Écrire un fichier.

!sudo - Appel shell commande sudo.

tee - La sortie de l'écriture (vim :w) commande redirigé à l'aide de té. Le % est rien, mais le nom du fichier en cours c'est à dire /etc/apache2/conf.d/mediawiki.conf. En d'autres termes té de la commande est exécutée en tant que root et il prend de l'entrée standard et l'écrire dans un fichier représenté par %. Cependant, cette vous invite à recharger le fichier de nouveau (touche L pour charger des changements dans vim):

tutoriel lien

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X