it-swarm.com.de

Wiederhole den letzten Befehl mit "Sudo"

Ich vergesse oft, Befehle mit Sudo auszuführen. Ich suche nach einer Möglichkeit, eine Bash-Funktion (oder einen Alias) zum Wiederholen des letzten Befehls mit Sudo zu erstellen. Etwas wie:

S() {
    Sudo $(history 1)
}

Irgendwelche Ideen?

57
Nemo

Du kannst schreiben:

Sudo !!

(Siehe §9.3 "History Expansion" im Bash Reference Manual .)

110
ruakh

Nicht genug?

Sudo !!

wenn Sie das S wollen, setzen Sie einfach:

alias S=Sudo

und benutze es

S !!

das !! meine das last command

23
jm666

Verwenden Sie alias redo='Sudo $(history -p !!)'. Dies ist das einzige, was ich gefunden habe, das mit Aliasen funktioniert. Die anderen Antworten funktionieren aus irgendeinem Grund nicht in Aliases, da sie selbst ausprobiert wurden, obwohl sie funktionieren, wenn sie direkt ausgeführt werden.

16
Aaron Franke

!! kann verwendet werden, um auf den letzten Befehl zu verweisen. So:

Sudo !!
15
Koterpillar

Hinzufügen und Erweitern der Antwort von aaron franke (die korrekt ist, aber kein warum enthält), sodass nach der Konfiguration des Alias ​​die Eingabe von redo funktioniert alias redo='Sudo $(history -p !!);

Dies ist das einzige, was ich gefunden habe, das mit Aliasen funktioniert

Es gibt ein paar Dinge, die diese Erklärung rechtfertigen.

alias redo='Sudo !!'

funktioniert nicht, da der Sudo Teil nicht ausgeführt wird, obwohl der !! aufgelöst wird.

Damit der Sudo !! Korrekt aufgelöst wird, muss eine Shell-Auflösungsanweisung ausgeführt und zusammen mit Sudo verkettet werden. So machen wir es;

alias redo='Sudo $(history -p !!)'

Wenn Sie die rechte Seite des Alias ​​für $(history -p !!) angeben, wird dies der Shell mitgeteilt.

  1. redo ist ein Alias, bewerte die rechte Seite des =
  2. Sudo bleibt wie es ist und es verkettet sich zu ...
  3. $() ist eine Shell-Direktive, mit der der Inhalt des aktuellen Ausführungsprozesses ausgeführt werden kann (im Gegensatz zu einer Sub-Shell ${}, Die einen anderen Prozess erzeugt, der ausgeführt werden soll).
  4. Auflösen history -p !!
  5. Der !! Wird als Ergebnis von Schritt 4 zu history -p <lastCommandHere> Erweitert.
  6. Der Teil -p Fordert history auf, nur die Ergebnisse zu drucken, nicht auszuführen
  7. Das Sudo führt die verbleibenden (jetzt in derselben Befehlszeile ausgedruckten) Befehle mit erhöhten Rechten aus, vorausgesetzt, das Passwort wurde korrekt eingegeben

Dies bedeutet letztendlich, dass der Befehl history -p !! Die Auflösung effektiv ausschreibt, anstatt sie nach dem Sudo auszuführen.

[~ # ~] Anmerkung [~ # ~] : Der ' ist signifikant. Wenn Sie " Verwenden, wird der !! Zweimal interpoliert. Um unseren Zweck zu erreichen, müssen wir die Auflösungsschritte sehr sorgfältig steuern. einfache/doppelte Anführungszeichen in Bash

[~ # ~] ps [~ # ~]

Wenn Sie zsh + oh-my-zsh Verwenden, gibt es ein Sudo Alias-Setup für _, Das Sie ausführen können.

_ !!

Welches wird den letzten Befehl als Sudo wiederholen. Wenn Sie jedoch den Alias ​​in ~/.zshrc Konfigurieren, funktioniert alias redo='Sudo $(history -p !!) nicht wie in der zsh-Konfiguration, da die Auflösungsschritte unterschiedlich sind.

Das heißt, Sie können den Alias ​​in ~/.bashrc Anstelle von ~/.zshrc Einfügen und das gleiche Ergebnis erzielen, wenn Sie den Alias ​​redo von zsh ausführen (vorausgesetzt, Sie haben zsh von sub-shelling bash, obwohl dies zugegebenermaßen ein bisschen kludge ist - obwohl ein funktionaler).

1
DiskJunky