Beaucoup d'entre vous ont probablement vu la commande qui vous permet d'écrire sur un fichier nécessitant une autorisation root, même si vous avez oublié d'ouvrir vim avec sudo:
:w !sudo tee %
Le fait est que je ne comprends pas exactement ce qui se passe ici.
Je l'ai déjà compris:
wc'est pour ça
*: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 |:!|.
il passe donc toutes les lignes en entrée standard.
La !sudo teepartie appelle teeavec des privilèges d'administrateur.
Pour que tout ait un sens, le %devrait afficher le nom de fichier (en tant que paramètre pour tee), mais je ne trouve pas de références dans l'aide pour ce comportement.
tl; dr Quelqu'un pourrait-il m'aider à disséquer cette commande?
sudoest appliqué à cat, mais pas à >, il n'est donc pas autorisé. Vous pouvez essayer d'exécuter la commande entière dans un sous-shell sudo, comme :w !sudo sh -c "cat % > yams.txt", mais cela ne fonctionnera pas non plus, car dans le sous-shell, %est nul; vous supprimerez le contenu de votre fichier.
:w !sudo sh -c "cat >%"fonctionne en fait aussi bien que sudo tee %parce que Vim remplace le nom de fichier %avant qu'il n'atteigne le sous-shell. Cependant, aucun d'eux ne fonctionne si le nom de fichier contient des espaces; vous devez faire :w !sudo sh -c "cat >'%'"ou :w !sudo tee "%"résoudre ce problème.
:w !sudo cat > %fonctionnerait pas aussi bien et ne polluerait pas la sortie standard?