Frage Wie kann ich die Bash-Geschichte durchsuchen und einen Befehl wiederholen?


Kann ich den Verlauf in bash durchsuchen und das Ergebnis ausführen?


271
2017-07-17 19:23


Ursprung




Antworten:


Art Strg  R in der Befehlszeile und beginnen Sie mit der Eingabe des vorherigen Befehls. Sobald ein Ergebnis angezeigt wird, schlagen Sie weiter Strg  R um andere Spiele zu sehen. Wenn der gewünschte Befehl angezeigt wird, drücken Sie einfach Eingeben

Beachten Sie, dass während Strg  R ist der Standardwert, wenn Sie den Befehl (reverse-search-history) an etwas gebunden sein Strg  T Sie könnten dies mit den folgenden konfigurieren:

bind '"\ C-t": umgekehrter Suchverlauf

Es gibt eine ganze Reihe anderer readline-bindbarer Befehle, die Ihnen ebenfalls zur Verfügung stehen. Sieh dir das an bash Man Seite.

Bash verfügt über viele Funktionen, um interaktive Befehlsverläufe zu durchsuchen und darauf zuzugreifen. Das grundlegendste ist das history eingebaut. Nur schreiben:

$ Geschichte

Druckt eine Liste von Befehlen zusammen mit einem numerischen Index wie:

$ Geschichte
1 klar
2 ls -al
3 vim ~ / somefile.txt
4 Geschichte
$

Sie können dann jeden dieser Befehle mit ihrem numerischen Index ausführen, indem Sie den Index mit einem einzigen voranstellen !, wie Mitch wies darauf hin:

$! 1

Wird das ausführen clear Befehl. Die Geschichte eingebaut hat viele Funktionen selbst, können Sie mehr in der sehen bash und history Manpages.

Sie können auch relative negative Offsets angeben, wenn Sie die Option verwenden ! Bezeichner, so dass wir unsere Geschichte Liste oben verwenden, wenn wir ausführen wollten vim wieder könnten wir tun:

$! -2

Das ist im Grunde gesagt Bash, um den Befehl auszuführen, den Sie "vor zwei Befehlen" ausgeführt haben. Um den vorherigen Befehl in der Verlaufsliste auszuführen, können wir einfach verwenden !! (Das ist nur Kurzform für !-1).

Das ! designator beschränkt Sie nicht auf die numerische Angabe, welcher Befehl ausgeführt werden soll. Hayalci hat gezeigt, dass Sie unterrichten können bash um einen Befehl auszuführen, der auf dem Text basiert, mit dem er beginnt (mithilfe von !) oder Text innerhalb des Befehls selbst (mit !?). Erneut, unter Verwendung unserer obigen Beispielverlaufsliste, wenn wir ausführen wollten clear wieder müssen wir nur noch tippen:

$! cl

und drücke Eingeben. Und was ist mit vim? Das ist so einfach wie:

$!? einige

Der wichtigste Punkt von HayalciDie Antwort ist der Aufruf an die shopt eingebaut:

$ shopt -s histverify

Dies aktiviert die Verlaufsüberprüfung, so dass Befehle, die von der !, !!, und !? Designatoren werden nicht blind ausgeführt, sondern stattdessen in die Befehlszeile eingegeben, so dass Sie sicherstellen können, dass sie nichts Böses tun, bevor Sie sie ausführen. Dies ist umso wichtiger, wenn Sie Befehle als Root-Benutzer ausführen. Diese Option kann in Ihrem eingestellt werden .bashrc Startup-Datei, so dass es bei jeder Anmeldung festgelegt wird.

Wie bereits erwähnt, können alle diese Informationen aus der bash Man Seite. Für die!, !!, und!? Kenner, werfen Sie einen Blick auf Abschnitt 9.3 Geschichte Erweiterung.


390
2017-07-17 19:25



+1 Ich verwende Linux seit über 12 Jahren für alle Systeme. Ich wusste nicht, dass es existiert. Ich wünschte, ich könnte +10 Wie habe ich es vermisst? - Aiden Bell
Ich habe es erst entdeckt, als ich Emacs regelmäßig benutzte. Dann habe ich es versehentlich in einen Tag getippt (dachte, ich wäre in Emacs). - Sean Bright
Bei vielen Systemen wird durch Drücken des Pfeils nach oben dasselbe ausgeführt. - mas
Der Pfeil nach oben geht einfach zum vorherigen Befehl. Aber ja, es ist alles bindbar zu was immer du willst. - Sean Bright
Auch nach dem Drücken von STRG + R können Sie STRG + UMSCHALT + R mehrmals verwenden, um zum vorherigen Befehl zurückzukehren - Gal Bracha


Als Alternative zu crtl + R, können Sie den Verlauf durchsuchen, indem Sie eingeben

!text

Dadurch wird der Verlauf nach dem letzten Befehl durchsucht Anfang mit 'Text'.

Aber ich schlage vor, Sie fügen dies in Ihre .bashrc ein, um die Ausführung eines falschen Befehls zu verhindern.

shopt -s histverify

Dies weist bash so an, dass nach irgendein Verlaufsaktionen (wie !!:s/prev_text/after_text), platziert es die resultierende Zeile an der Eingabeaufforderung. Dann können Sie den Befehl überprüfen oder bearbeiten und anschließend die Eingabetaste drücken.


34
2017-07-17 20:40



Verwenden Sie!? Text, um den letzten Befehl, der (im Gegensatz zu Anfang) "text" enthält, erneut auszuführen. - mark4o
Wenn jemand '!', '!!', '!?', 'History | grep 'und' ctrl-r 'zu einer umfassenden Antwort würde ich es auswählen. - Richard Hoskins


Sie könnten auch tun:

history | grep "stuff"

es würde etwas wie zurückkehren

num stuff

dann kannst du tippen

!num

27
2017-07-17 20:21





Ich bevorzuge die Verwendung von History-Search-Backward über Reverse-Search-History. Mit der ersten Option können Sie einige Zeichen des Befehls eingeben dann Drücken Sie die Suchtaste, anstatt zunächst die Suchtaste zu drücken und dann den Suchstring einzugeben.

Standardmäßig binden M-p und M-n an ähnliche Funktionen, aber ich bevorzuge die Bindung der Pfeiltasten:

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'

14
2018-02-02 20:32





Ausgezeichneter Bericht, Sean! Ich würde dies in einen Kommentar schreiben, aber ich bin ein paar Rufpunkte schüchtern. :-)

Eine weitere verwandte und nützliche Technik ist die Fähigkeit, einen vorherigen Befehl auszuführen, während ein Wort geändert wird. Angenommen, Sie haben den Verzeichnisnamen eingegeben oder möchten den Dateinamen ändern:

$ echo mein Name ist Bob
mein Name ist Bob
$ ^ bob ^ Jordan
Echo mein Name ist Jordanien
Mein Name ist Jordan

Beachten Sie, dass der Befehl erweitert, ersetzt und ausgegeben wird, bevor der Befehl ausgeführt wird. Wenn also der falsche Befehl ausgeführt wird, können Sie sehen, was bash dachte.


12
2017-09-10 14:23





Ich habe einen wirklich tollen Alias, h. Es ist wirklich nur "history | grep", aber ich filtere vorherige "h command" Einträge mit dem "grep -E -v"

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

benutzt wie

h aliases
2003  less .bash_aliases

12
2017-09-25 16:45



Dies kann auch durch Hinzufügen des Befehls zu HISTIGNORE. - tanenbring


Da die Navigation mit STRG-r durch die Historie IMO umständlich ist, sollten Sie dies berücksichtigen hh:

https://github.com/dvorka/hstr

Das macht die Navigation viel einfacher, unkomplizierter und effizienter - einschließlich der Ausführung des Befehls:

enter image description here


5
2017-12-18 16:37



Wie man es benutzt? Welche Tasten drücken, um dieses Bild zu sehen? - Nakilon
Sobald Sie hh installiert haben, können Sie entweder den Befehl hh verwenden oder ihn an eine beliebige Tastenkombination (normalerweise Strg-r) binden, wie in der Dokumentation beschrieben. - Martin Dvorak
es bindet an ctrl + r Standardmäßig jetzt - Alleo