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? `



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 !!)"'

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.


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


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>.


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.