Vous ne pouvez pas simplement rester sudo
devant une commande shell, vous devez invoquer un shell pour évaluer à nouveau cette commande (faire des choses comme développer des variables, ouvrir des fichiers pour des opérateurs de redirection, etc.). Donc, c'est
sudo bash -c !!
sauf que cela ne fonctionne pas tout à fait, car !!
interpole le texte de la commande précédente, les caractères spéciaux et tout. Vous devez récupérer le texte de la commande sous forme de chaîne et le transmettre comme argument à sh
. Heureusement, la fonction fc
intégrée de bash vous permet de le faire¹.
sudo bash -c "$(fc -ln -1)"
Ou même, pour être sûr d'invoquer la même version de bash en cours d'exécution:
sudo "$BASH" -c "$(fc -ln -1)"
Notez que puisque la commande est exécutée dans un processus shell séparé, elle hérite des variables d'environnement (uniquement celles qui les sudo
conservent, l'esprit), mais pas des variables internes du shell. Les options du shell (par exemple kshglob
) et d'autres paramètres commenceront par défaut.
La même commande² fonctionne dans zsh et ksh, bien que ATT ksh93 nécessite que le first
et le last
nombre soient passés à fc
³ (qui fonctionne également dans bash, zsh et pdksh / mksh):
sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"
Utiliser $0
pour désigner l'exécutable du shell en cours d'exécution ne fonctionne que si le shell a été appelé via $ PATH et que $ PATH n'a pas changé, ou via un chemin absolu.
Voici une autre méthode dans zsh qui est légèrement plus claire mais plus longue:
sudo zsh -c $history[$[HISTCMD-1]]
Un dernier mot d'avertissement: sudo
concerne les commandes potentiellement dangereuses. Ne le rendez pas trop facile à utiliser!
¹ Il y a un espace supplémentaire au début et la substitution de commandes supprime les nouvelles lignes à la fin, mais la syntaxe du shell s'en fiche.
² Je ne pense pas que zsh ou ksh aient quelque chose comme bash $BASH
; $0
ne fonctionne que lorsqu'il s'agit d'un chemin absolu, ou lorsqu'il ne contient pas de barre oblique et que le chemin de recherche de commande n'a pas changé.
³ est un alias pour dans ATT ksh mais c'est tout aussi bien. fc
hist