Führen Sie den vorherigen Befehl unter sudo erneut aus


8

Ich möchte in der Lage sein, einen Befehl auszuführen, der fehlschlägt, weil er nicht über die richtigen Berechtigungen verfügt. Dann kann ich "bitte" schreiben, um den Befehl auszuführen, den ich gerade ausgeführt habe.

Folgendes möchte ich im Terminal tun:

$ run command
"you don't have access to do that"
$ please
"ran successfully"

Ich habe gesehen, dass !!der vorherige Befehl abgerufen wird, also dachte ich, ich könnte das verwenden, aber ich kann es nicht zum Laufen bringen.

Mein bitte.sh-Shell-Skript sieht so aus, aber ich kann keines davon zum Laufen bringen. Es heißt nur "Befehl nicht gefunden !!" und druckt die Sudo-Verwendung aus.

#!/bin/zsh

#sudo !!
#sudo `!!`
sudo $(!!)

Funktioniert es ohne das Skript? Wenn Sie nur laufen, sudo !!läuft es wie erwartet? Ich glaube !! kann nur ein Bash-Alias ​​sein, so dass es in zsh nicht funktionieren kann
Chris Wayne

3
AFAIK, Verlaufserweiterung ( !!und andere) funktioniert nur in interaktiven Shells und nicht in Skripten.
Thor

sudo !!im interaktiven Modus funktioniert fast wie erwartet. Wenn ich die Eingabetaste drückte, wurde es durch !!den vorherigen Befehl ersetzt. dann musste ich erneut die Eingabetaste drücken, um es auszuführen.
jb.

Antworten:


6

Sie können nicht !!in einem Shell-Skript verwenden, da Sie in einer untergeordneten Shell nicht auf die übergeordnete Shell zugreifen können. Obwohl ich die Verwendung empfehle sudo !!, müssten Sie, wenn Sie wirklich ein BASH-Skript erstellen möchten, .bash_history wie folgt verwenden:

#!/bin/bash
sudo `cat $HOME/.bash_history | tail -n1`

Es ist definitiv keine perfekte Lösung, aber es sollte den Trick machen. Wenn Sie ZSH verwenden, funktioniert dies nicht, da ZSH (meines Wissens) nicht in .bash_history ausgibt. UPDATE : Hier ist eine Version, die mit ZSH funktionieren sollte:

#!/usr/bin/zsh
. $HOME/.zshrc
sudo `cat \`readlink -f $HISTFILE\` | tail -n1`

Hoffe das hilft!

Wenn Sie das Skript nicht verstehen, führt es einfach den zuletzt in BASH mit sudo eingegebenen Befehl aus.


OK. Ich benutze aber zsh. Gibt es ein Äquivalent für .bash_history in zsh?
jb.

Nun, da ich hinschaue, gibt es eine Version, die funktionieren sollte. Ich habe es aber noch nicht getestet.
MiJyn

Lesen Sie die Bash-Verlaufsdatei nicht direkt. Verwenden Sie die fcoder historyeingebauten. Standardmäßig wird $ HISTFILE erst aktualisiert, wenn Sie sich von bash abmelden.
Steven K

24

Fügen Sie Ihrer .zshrc hinzu:

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

Funktioniert ein Genuss, scheint besser als die oben akzeptierte Antwort für die Benutzerfreundlichkeit.
Mitchell Currie

2
Für Neugierige: fcsteht für fix befehl. Die Dokumentation finden Sie hier .
Dshepherd

Vielen Dank! Ich weiß, dass dies AskUbuntu ist, aber ich habe dies unter OSX verwendet, um meinen letzten Befehl in die System-Zwischenablage zu kopieren: alias lastcmd="fc -ln -1 | pbcopy"Ich glaube, dies sollte (?) Unter Ubuntu funktionieren : alias lastcmd="fc -ln -1 | xclip -selection clipboard.
HellaMad
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.