Réexécuter la commande précédente sous sudo

8

Je veux pouvoir exécuter une commande, elle échoue car elle ne dispose pas des autorisations appropriées. Ensuite, je peux écrire "s'il vous plaît" à sudo la commande que je viens d'exécuter.

Voici ce que je veux faire dans le terminal:

$ run command
"you don't have access to do that"
$ please
"ran successfully"

J'ai vu que !!cela récupérerait la commande précédente, donc j'ai pensé que je pouvais l'utiliser, mais je ne peux pas le faire fonctionner.

mon script shell please.sh ressemble à ceci, mais je ne peux pas faire fonctionner ces éléments. Il dit simplement "commande introuvable !!" et imprime l'utilisation de sudo.

#!/bin/zsh

#sudo !!
#sudo `!!`
sudo $(!!)
jb.
la source
Ça marche sans le script? Si vous exécutez, fonctionne- sudo !!t-il comme prévu? Je pense !! peut juste être un alias bash, donc cela peut ne pas fonctionner dans zsh
Chris Wayne
3
AFAIK, l'expansion de l'histoire ( !!et d'autres) ne fonctionne que dans des shells interactifs et non dans des scripts.
Thor
sudo !!en mode interactif fonctionne presque comme prévu. lorsque j'appuyais sur Entrée, il serait remplacé !!par la commande précédente. puis j'ai dû appuyer à nouveau sur enter pour l'exécuter.
jb.

Réponses:

6

Vous ne pouvez pas utiliser !!dans un script shell, car vous ne pouvez pas accéder au shell parent dans un shell enfant. Bien que je recommande d'utiliser sudo !!, si vous voulez vraiment créer un script BASH, vous devrez utiliser .bash_history, comme ceci:

#!/bin/bash
sudo `cat $HOME/.bash_history | tail -n1`

Ce n'est certainement pas une solution parfaite, mais cela devrait faire l'affaire. Si vous utilisez ZSH, cela ne fonctionnera pas, car ZSH ne sort pas dans .bash_history (à ma connaissance). MISE À JOUR : Voici une version qui devrait fonctionner avec ZSH:

#!/usr/bin/zsh
. $HOME/.zshrc
sudo `cat \`readlink -f $HISTFILE\` | tail -n1`

J'espère que cela t'aides!

Si vous ne comprenez pas le script, il exécute simplement la dernière commande entrée dans BASH avec sudo.

MiJyn
la source
D'accord. J'utilise cependant zsh. existe-t-il un équivalent pour .bash_history dans zsh?
jb.
Maintenant que je regarde, oui, il existe une version qui devrait fonctionner. Je ne l'ai pas encore testé cependant.
MiJyn
Ne lisez pas directement le fichier d'historique bash. Utilisez le fcou historyintégré. Par défaut, $ HISTFILE n'est pas mis à jour tant que vous ne vous déconnectez pas de bash.
Steven K
24

Ajoutez à votre .zshrc:

alias please='sudo $(fc -ln -1)'
jpschorr
la source
Fonctionne un régal, semble mieux que la réponse acceptée ci-dessus pour la facilité d'utilisation.
Mitchell Currie
2
Pour les curieux: fcsignifie commande fixe. La documentation est ici .
dshepherd
Je vous remercie! Je sais que c'est AskUbuntu, mais je cela sur OSX pour copier ma dernière commande au presse - papiers du système: alias lastcmd="fc -ln -1 | pbcopy"Je crois que cela devrait fonctionner sur Ubuntu (?): alias lastcmd="fc -ln -1 | xclip -selection clipboard.
HellaMad