Kann ich den Verlauf in bash durchsuchen und das Ergebnis ausführen?
Kann ich den Verlauf in bash durchsuchen und das Ergebnis ausführen?
Antworten:
Geben Sie Ctrl Rin die Befehlszeile ein und beginnen Sie mit der Eingabe des vorherigen Befehls. Sobald ein Ergebnis angezeigt wird, drücken Sie die Taste Ctrl R, um weitere Übereinstimmungen anzuzeigen. Wenn der gewünschte Befehl angezeigt wird, drücken Sie einfachEnter
Beachten Sie, dass while Ctrl Rdie Standardeinstellung ist, wenn Sie möchten, dass der Befehl ( reverse-search-history
) an Ctrl TFolgendes gebunden wird :
Bind '"\ Ct": Reverse-Search-History'
Es gibt eine ganze Reihe weiterer readline-bindbarer Befehle, die Ihnen ebenfalls zur Verfügung stehen. Schauen Sie sich die bash
Manpage an .
Bash verfügt über zahlreiche Funktionen zum Suchen und Zugreifen auf den interaktiven Befehlsverlauf. Das grundlegendste davon ist das history
eingebaute. Tippen Sie einfach:
$ history
Gibt eine Liste von Befehlen zusammen mit einem numerischen Index aus, wie zum Beispiel:
$ history 1 klar 2 ls-al 3 vim ~ / somefile.txt 4 geschichte $
Sie können dann jeden dieser Befehle unter Verwendung des numerischen Index ausführen, indem Sie dem Index eine einzelne voranstellen !
, wie Mitch ausführte:
$! 1
Führt den clear
Befehl aus. Die Geschichte builtin hat viele Funktionen selbst, Sie mehr in der sehen bash
und history
man - Seiten.
Sie können auch relative negative Offsets angeben, wenn Sie den !
Bezeichner verwenden. Wenn wir also unsere Verlaufsliste oben vim
erneut ausführen möchten, können wir Folgendes tun:
$! -2
Das bedeutet, dass bash den Befehl ausführen soll, den Sie vor "zwei Befehlen" ausgeführt haben. Um den vorherigen Befehl in der Verlaufsliste auszuführen, können wir einfach verwenden !!
(was nur eine Abkürzung für ist !-1
).
Der !
Bezeichner beschränkt sich nicht auf die numerische Angabe des auszuführenden Befehls. hayalci hat gezeigt, dass Sie anweisen können bash
, einen Befehl basierend auf dem Text auszuführen, mit dem er beginnt (using !
), oder basierend auf dem Text im Befehl selbst (using !?
). Unter Verwendung der obigen Beispielverlaufsliste müssen wir nur Folgendes eingeben, wenn wir clear
erneut ausführen möchten:
$! cl
und drücken Sie Enter. Und was ist mit vim
? Das ist so einfach wie:
$!? einige
Der wichtigste Punkt in Hayalcis Antwort ist der Aufruf an das shopt
eingebaute System:
$ shopt -s histverifizieren
Auf diese Weise wird die Verlaufsüberprüfung aktiviert, sodass Befehle, die mit dem,, und den Bezeichnern übereinstimmen !
, nicht blind ausgeführt, sondern in der Befehlszeile eingegeben werden, damit Sie sicherstellen können, dass sie vor der Ausführung nichts Böses tun. Dies ist umso wichtiger, wenn Sie als Root-Benutzer Befehle ausführen. Diese Option kann in Ihrer Startdatei festgelegt werden, sodass sie bei jeder Anmeldung festgelegt wird.!!
!?
.bashrc
Wie bereits erwähnt, können alle diese Informationen aus der bash
Manpage entnommen werden . Für die!, !! und!? Bezeichner finden Sie in Abschnitt 9.3, Verlaufserweiterung .
shopt
Geht in bashrc, nicht in bash_profile (oder wird nicht für Shells aktiviert, die keine Login-Shells sind).
Alternativ dazu crtl+Rkönnen Sie den Verlauf durchsuchen, indem Sie Folgendes eingeben
!text
Dadurch wird der Verlauf nach dem neuesten Befehl durchsucht, der mit 'text' beginnt .
Aber ich schlage vor, Sie fügen dies in Ihre .bashrc-Datei ein, um die Ausführung eines falschen Befehls zu verhindern.
shopt -s histverify
Dies weist bash , so dass nach irgendwelchen Geschichte Aktionen (wie !!:s/prev_text/after_text
), ist es die resultierende Zeile der Eingabeaufforderung stellt. Anschließend können Sie den Befehl überprüfen oder bearbeiten und anschließend die Eingabetaste drücken.
Ich bevorzuge es, History-Search-Backward gegenüber Reverse-Search-History zu verwenden. Ersteres lässt Sie ein paar Zeichen des Befehls eingeben und dann die Suchtaste drücken, anstatt zuerst die Suchtaste zu drücken und dann die Suchzeichenfolge einzugeben.
Standardmäßig binden Mp und Mn auf meinem System an ähnliche Funktionen, aber ich bevorzuge das Binden der Pfeiltasten:
bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
Ich habe einen wirklich tollen Alias, h. Es ist wirklich nur "history | grep", aber ich filtere vorherige "h command" -Einträge mit "grep -E -v" aus
alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "
gebraucht wie
h aliases
2003 less .bash_aliases
HISTIGNORE
.
Hervorragender Bericht, Sean! Ich würde das in einen Kommentar schreiben, aber ich bin ein paar Rufpunkte schüchtern. :-)
Eine andere 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:
Ich heiße Bob mein Name ist Bob $ ^ Bob ^ Jordan Echo, mein Name ist Jordan 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 gedacht hat.
Da die Navigation durch den Verlauf mit Strg-R IMO umständlich ist, sollten Sie Folgendes berücksichtigen :
https://github.com/dvorka/hstr
Dies macht die Navigation viel einfacher, einfacher und effizienter - einschließlich der Ausführung des Befehls:
ctrl + r
jetzt standardmäßig an
Geben Sie an der Bash-Eingabeaufforderung control-R ein und geben Sie dann einige Zeichen des gewünschten Befehls ein. Die Readline-Funktion von Bash durchsucht den Befehlsverlauf 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 konfigurieren verwenden vi
Tastenbelegungen ( set -o vi
oder mit set editing-mode vi
in $HOME/.inputrc
), dann suchen Sie mit <Esc>/some-command<Return>
und schlagen n
(nächste) oder Shift-n
(zurück) , um durch die Geschichte Kommandozeile.
Ich mag HSTR, aber ich kann es manchmal nicht 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, holen Sie sich die Geschichtesed
: Entferne die Nummernspalte aus der Liste (POSIX)fzf
: Hier ist die Magie: Ermöglicht die interaktive Fuzzy-Suche in der Liste oder das Bewegen mit C-J
und C-K
Ausführen eines Befehls mit Enter
.--height
: Stellen Sie die Anzahl der angezeigten Zeilen ein.--tac
: Liste zurücksetzen (logischer für eine Geschichte)--tiebreak=index
: Behalte die Verlaufsreihenfolge, wenn FZF die Ergebnisse aktualisiert