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:
w
c'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 tee
partie appelle tee
avec 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?
sudo
est 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?