Wie kann ich "alias sudo !!"?

50

Ich versuche, einen Alias ​​für sudo !!in Bash festzulegen. Ich habe es versucht alias sbb='sudo !!', aber es interpretiert das als wörtlich !!und druckt

sudo: !!: command not found

Wenn ich doppelte Anführungszeichen verwende, wird der doppelte Knall in der Zeichenfolge selbst ersetzt, sodass dies nicht funktioniert.

Gibt es eine Möglichkeit, diese Arbeit zu machen? Oder ein alternativer Alias? `

Manishearth
quelle
Siehe auch Eine Befehlszeile mit einem Sudo ausführen
Gilles 'SO - aufhören, böse zu sein'
Mögliches
selbes

Antworten:

61

!!wird bei der Eingabe um Bash erweitert. Es wird nicht durch Alias-Ersetzung erweitert.

Sie können die historyeingebaute Funktion verwenden, um die Erweiterung durchzuführen:

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

Wenn der Befehl mehr als ein einfacher Befehl ist (z. B. enthält er Umleitungen oder Pipes), müssen Sie eine Shell unter sudo aufrufen:

alias sbb='sudo "$BASH" -c "$(history -p !!)"'
rici
quelle
Hast du eine für tcsh?
mdpc
1
@mdpc: Ich benutze keine tcsh, aber ich sah auf man tcshund entdecken , dass es tut , tut Geschichte Expansion während alias Expansion „ als ob der ursprüngliche Befehl war die vorherige Eingabezeile.“ Interessant. Hat alias sbb 'sudo \!-2jedoch nicht wie erwartet funktioniert (hat tatsächlich den zweiten vorherigen Eintrag ersetzt); alias sbb 'sudo \!\!'funktioniert als (substituiert erwartet sbbfür !!); und am Ende stellte sich heraus, dass das, was ich wollte, das war, alias sbb 'sudo \!-1'was ich erwartet hätte, dasselbe zu sein wie \!\!. (tcsh 6.17.06 (Astron) 15.04.2011) YMMV. Viel Glück.
rici
Vielen Dank! Dieser Alias ​​ist großartig, wenn Sie als Administrator vergessen haben, sudo vor Ihren Befehl zu stellen.
MDPC
stattdessen sbbwürde ich es vorziehen, preaseals Alias ​​wie von @jpschorr
rubo77 vorgeschlagen
40

Versuchen:

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

Ich mag es eigentlich lieber "bitte" zu nennen:

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

Info: fcist ein eingebauter Befehl in der Bash-Shell. Hier werden Befehle aufgelistet, bearbeitet und erneut ausgeführt, die zuvor in eine interaktive Shell eingegeben wurden.

jpschorr
quelle
13
pleaseist definitiv der richtige Weg!
Anto
Funktioniert auch für Bash, also entferne den 'for zsh'-Kommentar.
Michael Durrant
1
Funktioniert gut in zsh. fc ist der zu verwendende Befehl. Vielen Dank
Frax
pleaseEs fühlt sich so an, als ob das Terminal eine Einheit ist, in der ich nett sein muss, um Dinge zu erledigen. Ich bevorzuge etwas, das ein besseres Gefühl der Kontrolle gibt - wie fuck;)
Przemek D
5

Jetzt gibt es ein Repository für diesen Zweck in GitHub, es prüft auf magische Weise, ob es Superuser-Rechte benötigt, und behebt auch die Tippfehler:

https://github.com/nvbn/thefuck

Arda
quelle
Ich habe versucht, apt-get install thefuckwas existiert, aber es funktioniert nicht auf meinem Ubuntu 15.10; (
rubo77
0

Dies wurde ursprünglich bei dieser Frage gepostet , aber später vorgeschlagen, hier zu posten.

Hier erfahren Sie, wie Sie fcund historymit Alias ​​für !-ähnliche Ersetzungen verwenden können. Nehmen wir an, wenn Sie verwenden möchten !-n(wo n ist die Ziffer für n - te letzte Befehl verwendet wird ), dann können Sie verwenden fcund historymit alias wie folgt:

  1. Verwenden von history:

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

    Hinweis: Hier !-nsollte mit 'oder umschlossen werden ''.

  2. Verwenden von fc:

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

    Hinweis: hier 1 st und 2 nd -n werden verwendet , um den Bereich der Verlaufsliste angeben.

Hier habe ich Echo-Echo benutzt, bevor ich den Befehl zum Fällen ausgeführt habe !-<n>.

Pandya
quelle
Die vorherigen Antworten decken bereits history -pund ab fc. Alles neu hier?
Muru
Ok, was ist damit?
Muru
Ich finde das -ln -n -nsehr verwirrend; auch das bisschen über 'oder ''(und auch das bisschen über -<n>).
Scott
Option 2. muss ein Tippfehler sein, ich denke, Sie wollen$(fc -ln -1)
cmcginty
-1
alias please="sudo $(history -p \!\-2)"
Antonin GAVREL
quelle