Comment puis-je `alias sudo !!`?

50

J'essaie de définir un alias pour sudo !!Bash. J'ai essayé alias sbb='sudo !!', mais il interprète cela comme un littéral !!et imprime

sudo: !!: command not found

Si j'utilise des guillemets doubles, il remplace le double coup dans la chaîne elle-même, de sorte que cela ne fonctionne pas.

Y a-t-il un moyen de faire fonctionner cela? Ou un alias alternatif? `

Manishearth
la source
Voir aussi Exécuter une ligne de commande avec un sudo
Gilles "arrête d'être méchant"
Même chose possible sur le SU: superuser.com/questions/240180/…
Ciro Santilli a annoncé le

Réponses:

61

!!est étendu par bash lorsque vous le tapez. Il n'est pas étendu par la substitution d'alias.

Vous pouvez utiliser la fonction historyintégrée pour faire l’extension:

alias sbb='sudo $(history -p !!)'

Si la commande est plus qu'une simple commande (par exemple, elle contient des redirections ou des tuyaux), vous devez appeler un shell sous sudo:

alias sbb='sudo "$BASH" -c "$(history -p !!)"'
rici
la source
Vous en avez un pour tcsh?
Mdpc
1
@mdpc: Je ne me tcsh, mais je jetai un regard man tcshet découvert qu'il fait faire l' expansion de l' histoire lors de l' expansion d'alias « comme si la commande initiale était la ligne d'entrée précédente. » Intéressant. Cependant, cela alias sbb 'sudo \!-2n’a pas fonctionné comme prévu (il a en fait substitué la deuxième entrée précédente); alias sbb 'sudo \!\!'a fonctionné comme prévu (substitué sbbà !!); et à la fin il s’est avéré que ce que je voulais, c’était alias sbb 'sudo \!-1'ce à quoi je me serais attendu \!\!. (tcsh 6.17.06 (Astron) 2011-04-15) YMMV. Bonne chance.
Rici
Merci! Cet alias est génial quand, en tant qu'administrateur, vous oubliez de mettre sudo devant votre commande.
Mdpc
au lieu de sbbje préférerais preasecomme alias comme suggéré par @jpschorr
rubo77
40

Essayer:

alias sbb='sudo $(fc -ln -1)'

J'aime plutôt préférer l'appeler 's'il vous plaît':

alias please='sudo $(fc -ln -1)'

Info: fcest une commande intégrée dans le shell bash. qui répertorie, édite et réexécute les commandes précédemment entrées dans un shell interactif.

jpschorr
la source
13
pleaseest définitivement la voie à suivre!
Anto
fonctionne pour bash aussi, alors supprimez le commentaire 'for zsh'.
Michael Durrant
1
Fonctionne bien en zsh. fc est la commande à utiliser. Merci
Frax
pleasedonne l'impression que le terminal est une entité avec laquelle je dois être gentil pour que tout soit fait. Je préfère quelque chose qui donne un meilleur sens du contrôle - du genre fuck;)
Przemek D
5

Maintenant, il existe un référentiel à cet effet dans GitHub, il vérifie par magie s'il a besoin des droits de superutilisateur, corrige également les fautes de frappe:

https://github.com/nvbn/thefuck

Arda
la source
J'ai essayé apt-get install thefuckce qui existe, mais cela ne fonctionne pas sur mon Ubuntu 15.10; (
rubo77
0

Cela a été initialement posté à cette question, mais plus tard, suggéré de poster ici.

Voici comment vous pouvez utiliser fcet historyavec alias pour des !-substitutions semblables. Supposons que si vous voulez utiliser !-n(où n est le chiffre de la nième dernière commande utilisée), vous pouvez utiliser fcet historyavec alias comme suit:

  1. Utilisant history:

    alias xyz='echo $(history -p "!-<n>") ; sudo $(history -p "!-n")'

    Note: Ici !-ndevrait être inclus avec 'ou ''.

  2. Utilisant fc:

    alias xyz='echo $(fc -ln -n -n) ; sudo $(fc -ln -n -n)'

    Remarque: ici, les 1 er et 2 e -n servent à spécifier la plage de l'historique.

Ici, j'ai utilisé l'écho avant d'exécuter une commande d'abattage similaire !-<n>.

Pandya
la source
Les réponses précédentes couvrent déjà history -pet fc. Quelque chose de nouveau ici?
Muru
Ok, qu'est-ce que c'est?
Muru
Je trouve le -ln -n -nêtre extrêmement déroutant; aussi le peu sur 'ou ''(et aussi le peu sur -<n>).
Scott
Option 2. doit être une faute de frappe, je pense que vous voulez$(fc -ln -1)
cmcginty
-1
alias please="sudo $(history -p \!\-2)"
Antonin GAVREL
la source