Sie können nicht einfach sudovor 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 fcbuiltin 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, sudodie 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 firstund lastnumber 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 $0der 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 sudosich 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. $0Funktioniert 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. fchist