Antworten:
Der einfachste Weg ist zu laufen:
sudo !!
Dies wird den letzten Befehl ausführen, aber als Superuser.
Quelle .
!!
Ihres vorherigen Befehls wie in gespeichert aus history
. Darüber hinaus tun !-1
, !-2
und so führt auf den letzten Befehl, vorletzter Befehl ein , und so weiter. Praktisch!
!<command>
wird das letzte Event von ~/.bash_history
diesem Anfang an mit<command>
!
Bash-Ding, von dem kopiert wurde, tcsh
hat mich öfter durcheinander gebracht, als es jemals nützlich gewesen ist. Doppelte Anführungszeichen schützen nicht vor der Interpretation von !
. $ foo "!bar"
-> !bar: event not found
.
Für den Fall, dass Sie nicht mehr weiterkommen möchten
Antwort : Sie geben sudo !!
direkt danach ein, um den vorherigen Befehl mit erweiterten Berechtigungen zu wiederholen.
edit: Bild gefunden via reddit , und es ist eine Parodie des originalen xkcd-Comics von Randall Munroe.
Sie können versuchen, mit der Aufwärtspfeiltaste durch Ihre alten Befehle zu scrollen und sie umzuschreiben / zu ändern und die sudo
vor ihnen hinzuzufügen . (Die Home-Taste über den Pfeiltasten setzt die Position an den Anfang.)
Ich mag die sudo !!
Idee nicht, weil man manchmal einen anderen Befehl dazwischen hinzufügt und sich nicht mehr erinnert.
sudo !!
die Shell dann erweitert, !!
sodass Sie sehen können, welcher Befehl ausgeführt werden soll. Daher kann es irritierend sein, Strg-C zu drücken und den richtigen Befehl zu finden, aber Sie werden zumindest nicht überrascht.
!!
sudo !!<TAB>
und es wird automatisch !!
vervollständigt. Bash kann die Geschichte mit M-^
(für mich Alt + Shift + 6) erweitern, aber das ist weniger fließend (Sie könnten dies jedoch neu binden). Es gibt auch shopt -s histverify
eine Option, mit der Sie die Verlaufserweiterung anzeigen und bearbeiten können, wenn Sie die Eingabetaste drücken.
shopt -s histverify
hilft kein bisschen. Die meisten Leute werden sich daran gewöhnen, Enter
zweimal zu schlagen . Zu diesem Zeitpunkt sind sie noch zu spät, um zu überprüfen, was passiert ist.
Ich füge nur eine Alternative hinzu: So kurz wie das Tippen sudo !!
und flexibler:
Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A (place cursor at beginning of line)
"sudo "
Enter
Es ist genau die gleiche Anzahl von Tastenanschlägen (ich zähle "Strg + A" als einen ...), aber wenn Sie "Pfeil nach oben" hinzufügen, können Sie dies mit jedem Befehl in Ihrem Verlauf tun.
set -o vi
) verwenden. Dann können Sie Escape (in den Befehlsmodus wechseln) und dann 'I' (Großbuchstabe 'i', am Zeilenanfang einfügen).
Hierfür gibt es verschiedene Möglichkeiten
Geben Sie einfach den Befehl erneut ein und fügen Sie ihn sudo
vor dem Befehl hinzu
Drücken Sie Up arrowden letzten Befehl zu bekommen und legte sudo
vor ihm.
Eingeben sudo !!
Das wird !!
zum zuletzt eingegebenen Befehl erweitert. Sie können ähnliche Dinge mit anderen Dingen in der Befehlszeilenhistorie tun, siehe hier
Diese Frage hätte in "Den gleichen Befehl ausführen, aber mit einigen Änderungen " verallgemeinert werden können , da eine der brillanten Entwurfsentscheidungen in Unix darin besteht, dass das, was einmal in der Shell implementiert ist, von jedem Befehl genutzt werden kann, der von der Shell aus aufgerufen wird.
Mit anderen Worten, dieser Trick gilt nicht nur für sudo
:
sudo !!
)time !!
)env A=b B=z !!
)!!
)Die Verlaufserweiterung (auch als Verlaufsersetzung bezeichnet) ist nur eine Shell-Funktion, die das Wiederholen früherer Befehle erleichtert (mit weniger Tastenanschlägen). Überprüfen Sie Ihre Shell-Manpage auf history expansion
. Es werden viele weitere Tricks und Verknüpfungen beschrieben, die Sie beispielsweise mit der Geschichte ausführen können:
Sie können sich auf frühere Befehle durch Nummer beziehen:
!55 # repeat command number 55
!-1 # repeat the previous command, alias for !!
!-2 # repeat the command before the previous command
Sie können in früheren Befehlen auf einzelne Wörter verweisen:
some-command !$ # run some-command on the last arg of previous command
Sie können auch suchen, bevor Sie Folgendes wiederholen:
!?awk # repeat the last command including the string 'awk'
Sie können den Verlauf durchsuchen und etwas durch etwas anderes ersetzen:
!?awk?:s/str1/str2/ # repeat previous command matching 'awk' replacing str1 by str2
Und vieles mehr, da Sie die Befehlsauswahl, die Argumentauswahl, das Suchen und Ersetzen unabhängig voneinander kombinieren können.
Die Manpage Ihrer Shell (in diesem Fall man bash
) ist Ihr Freund.
Ich verwende zsh anstelle von bash und habe dies in meinem ~/.zshrc
, also drücke Alt+ Sfüge sudo
am Anfang der Kommandozeile ein:
insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo
Leider konnte ich keine Möglichkeit finden, dasselbe in bash zu tun.
~/.inputrc
"\es":"\C-asudo "
und Sie werden an den Anfang einer langen Zeile verschoben, und sudo wird beim Drücken von am Anfang der Zeile eingefügt alt-s
. Starten Sie das Terminal neu oder lesen Sie ~/.inputrc
es erneut, damit es funktioniert.
Wenn Sie es in einem Alias tun möchten, müssen Sie alias redo='sudo $(history -p !!)'
aus irgendeinem Grund verwenden.
So wie ich es mag:
Aber es könnte einfacher sein, einfach "sudo !!" zu machen, es liegt an Ihnen.