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



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

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.


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


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.