Wie kann ich die Bash-Historie durchsuchen und einen Befehl erneut ausführen?
Kann ich den Verlauf in der Bash durchsuchen und das Ergebnis ausführen?
Kann ich den Verlauf in der Bash durchsuchen und das Ergebnis ausführen?
Als Alternative zu crtl+R können Sie den Verlauf durchsuchen, indem Sie
!text
eingeben.
Aber ich schlage vor, dass Sie dies in Ihre .bashrc schreiben, um die Ausführung eines falschen Befehls zu verhindern.
shopt -s histverify
Dies weist die Bash so an, dass sie nach beliebigen History-Aktionen (wie !!:s/prev_text/after_text
) die resultierende Zeile in die Eingabeaufforderung stellt. Dann können Sie den Befehl überprüfen oder bearbeiten und anschließend die Eingabetaste drücken.
Ich verwende lieber “history-search-backward” als “reverse-search-history”. Ersteres lässt Sie ein paar Zeichen des Befehls eingeben dann die Suchtaste drücken, im Gegensatz dazu, dass Sie erst die Suchtaste drücken und dann den Suchstring eingeben.
Standardmäßig sind auf meinem System M-p und M-n an ähnliche Funktionen gebunden, aber ich bevorzuge die Bindung der Pfeiltasten:
bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
Exzellenter Bericht, Sean! Ich würde das in einen Kommentar schreiben, aber ich bin ein paar Rufpunkte zu schüchtern :-)
Eine andere verwandte und nützliche Technik ist die Möglichkeit, einen vorherigen Befehl auszuführen, während man ein Wort ändert. Sagen wir, Sie haben sich im Verzeichnisnamen vertippt oder wollen den Dateinamen ändern:
$ echo my name is bob my name is bob $ ^bob^jordan echo my name is jordan my name is jordan
Beachten Sie, dass der Befehl expandiert, ersetzt und ausgegeben wird, bevor der Befehl ausgeführt wird, so dass Sie, wenn der falsche Befehl ausgeführt wird, sehen können, was die Bash dachte, was sie tut.
Da die Navigation durch die Historie mit Strg-r IMO umständlich ist, sollten Sie hh in Betracht ziehen: https://github.com/dvorka/hstr
, was die Navigation viel einfacher, unkomplizierter und effizienter macht - einschließlich der Ausführung des Befehls:
Geben Sie an der Bash-Eingabeaufforderung control-R ein und dann ein paar Zeichen des gewünschten Befehls, und die Readline-Funktion der Bash durchsucht die Befehlshistorie nach diesem Befehl.
Nachdem Sie die Suche gestartet haben, können Sie erneut control-R eingeben, um zum nächsten passenden Befehl zu springen.
Wenn Sie Ihre Shell so konfiguriert haben, dass sie vi
-Tastenbindungen verwendet (set -o vi
oder mit set editing-mode vi
in $HOME/.inputrc
), dann suchen Sie mit <Esc>/some-command<Return>
und drücken n
(next) oder Shift-n
(previous), um durch den Befehlszeilenverlauf zu gehen.
STRG+R funktioniert gut, wie @John1024 vorgeschlagen hat, ist aber etwas mühsam, wenn viele Ihrer letzten Befehle ähnlich sind und Sie eine schnelle Möglichkeit haben möchten, sie alle zu scannen. Eine Alternative wäre die Verwendung von history
:
$ history | grep keyword
Ich mag HSTR, aber manchmal scheint es mir nicht möglich zu sein, es zu installieren. Also habe ich einen Alias mit fzf geschrieben, der sein Verhalten nachahmt (hx
, für “history execute”)
alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
history
: nun, holt die History sed
: entfernt die Zahlenspalte aus der Liste (POSIX) fzf
: hier ist die Magie, erlaubt es Ihnen, die Liste interaktiv zu durchsuchen, oder sich mit C-J
und C-K
zu bewegen, dann einen Befehl mit Enter
auszuführen. --height
: legt die Anzahl der angezeigten Zeilen fest. --tac
: Liste umkehren (logischer für einen Verlauf) --tiebreak=index
: die Reihenfolge des Verlaufs beibehalten, wenn fzf die Ergebnisse aktualisiert