Comment le vim “écrire avec sudo” tour?

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

de sorte qu'il passe toutes les lignes en entrée standard.

La !sudo tee le cadre des appels tee avec des privilèges d'administrateur.

Pour tous les sens, la % 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?

  • Serait :w !sudo cat > % ne pas fonctionner aussi bien, et de ne pas polluer la sortie standard?
  • non, cela ne fonctionne pas. Dans ce cas, sudo est appliqué à cat, mais de ne pas >, de sorte qu'il n'est pas permis. Vous pouvez essayer de l'exécution de l'ensemble de la commande dans un sudo shell interne est exécuté, comme :w !sudo sh -c "cat % > yams.txt", mais ça ne fonctionne pas non plus, parce que dans le shell interne est exécuté, % est nul; vous aurez vide le contenu de votre fichier.
  • Vous pourriez probablement utiliser :w !sudo sh -c 'cat $1 > yams.txt' - %, mais je ne sais pas comment cela va gérer les caractères spéciaux ou des espaces
  • Je souhaite juste ajouter qu'après avoir tapé cette commande, un message d'avertissement peut apparaître. Si oui, appuyez sur L. Alors, il vous sera demandé d'appuyer sur entrée. Et vous, vous allez enfin avoir votre fichier enregistré.
  • qui a déjà été suggéré et rejected: sudo s'applique à cat de ne pas >
  • :w !sudo sh -c "cat >%" en fait, il fonctionne tout aussi bien que sudo tee % parce que Vim substitue le nom de fichier pour % avant qu'il ne se fait jamais à la shell interne est exécuté. Cependant, aucun d'eux ne fonctionne que si le nom de fichier avec des espaces; que vous avez à faire :w !sudo sh -c "cat >'%'" ou :w !sudo tee "%" pour résoudre ce problème.
  • Enregistrer à l'aide de :W et recharger le fichier: commande W :executer:silent w !sudo tee % > /dev/null',|: modifier!
  • Notez que cette astuce actuellement ne pas travail travailler avec neovim.

InformationsquelleAutor Doppelganger | 2010-04-08