2009-07-17 19:23:49 +0000 2009-07-17 19:23:49 +0000
302
302

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?

Antworten (10)

38
38
38
2009-07-17 20:40:32 +0000

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.

33
33
33
2009-07-17 20:21:39 +0000

Sie könnten auch Folgendes tun:

history | grep "stuff"

Es würde etwas wie

num stuff

zurückgeben.

16
16
16
2011-02-02 20:32:12 +0000

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'
13
13
13
2014-09-25 16:45:14 +0000

Ich habe einen wirklich tollen Alias, h. Es ist eigentlich nur “history | grep”, aber ich filtere frühere “h command”-Einträge mit dem “grep -E -v”

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

verwendet wie

h aliases
2003 less .bash_aliases
12
12
12
2009-09-10 14:23:48 +0000

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.

6
6
6
2014-12-18 16:37:14 +0000

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:

4
4
4
2014-09-04 04:55:04 +0000

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.

3
3
3
2015-11-22 15:21:56 +0000

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.

2
2
2
2014-09-04 05:11:10 +0000

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
0
0
0
2019-05-22 13:17:52 +0000

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