Sie können nicht einfach sudo
vor einem Shell-Befehl bleiben, sondern müssen eine Shell aufrufen, um diesen Befehl erneut auszuwerten (z. B. Variablen erweitern, Dateien für Umleitungsoperatoren öffnen usw.). So das ist
sudo bash -c !!
außer dass dies nicht ganz funktioniert, weil !!
der Text des vorherigen Befehls, Sonderzeichen und alles interpoliert. Sie müssen den Text des Befehls als Zeichenfolge abrufen und als Argument an übergeben sh
. Glücklicherweise bash fc
builtin können Sie that¹ tun.
sudo bash -c "$(fc -ln -1)"
Oder, um sicherzugehen, dass Sie dieselbe Version von bash aufrufen, die gerade ausgeführt wird:
sudo "$BASH" -c "$(fc -ln -1)"
Beachten Sie, dass der Befehl, da er in einem separaten Shell-Prozess ausgeführt wird, Umgebungsvariablen (nur diejenigen, sudo
die mind beibehalten), aber keine internen Shell-Variablen erbt . Shell-Optionen (z. B. kshglob
) und andere Einstellungen beginnen ebenfalls mit der Standardeinstellung.
Der gleiche Befehl² funktioniert in zsh und ksh, obwohl ATT ksh93 die Übergabe von first
und last
number an fc
³ erfordert (was auch in bash, zsh und pdksh / mksh funktioniert):
sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"
Das Festlegen $0
der ausführbaren Datei der laufenden Shell funktioniert nur, wenn die Shell über $ PATH aufgerufen wurde und sich $ PATH nicht geändert hat oder über einen absoluten Pfad.
Hier ist eine andere Methode in zsh, die etwas klarer, aber länger ist:
sudo zsh -c $history[$[HISTCMD-1]]
Ein letzter Warnhinweis: bezieht sudo
sich auf potenziell gefährliche Befehle. Mach es dir nicht zu einfach, es zu benutzen!
¹ Am Anfang steht ein zusätzliches Leerzeichen, und die Befehlsersetzung entfernt am Ende Zeilenumbrüche, aber die Syntax der Shell kümmert sich nicht darum.
² Ich glaube nicht, dass zsh oder ksh so etwas wie bashs haben $BASH
. $0
Funktioniert nur, wenn es sich um einen absoluten Pfad handelt oder wenn er keinen Schrägstrich enthält und sich der Befehlssuchpfad nicht geändert hat.
³ ist ein Alias für in ATT ksh, aber das ist genauso gut. fc
hist