Bereits verwendete Kommandos in der Shell-History wiederfinden

Aus LinuxUser 01/2025

Bereits verwendete Kommandos in der Shell-History wiederfinden

© Tomasz Wyszolmirski / 123RF.com

Zurückblättern

Ebenso schnell, wie man es tippt, ist ein mitunter komplexes CLI-Kommando wieder vergessen. Mit cleveren Helfern finden Sie es in der Shell-History wieder.

Sowohl die Bash als auch andere Shells wie die Z-Shell führen eine Historie über die von Ihnen eingetippten Kommandos [1]. Ohne Änderungen der Standardkonfiguration speichert die Bash die sogenannte History in der Datei .bash_history in Ihrem Heimatverzeichnis. Um einen anderen Namen oder Speicherort für die Datei festzulegen, ergänzen Sie die Umgebungsvariable HISTFILE in der lokalen .bashrc um den gewünschten Speicherort [2]. Die Zsh agiert ähnlich.

In jedem Fall handelt es sich um eine Textdatei, deren Inhalt Sie mit Werkzeugen wie Cat, History und Fc anzeigen. Dabei erfolgt die Ausgabe der Einträge chronologisch, beginnend mit dem ältesten aufgezeichneten Kommando. In der Grundeinstellung speichert die Bash nicht weniger als 1000 Einträge.

Listing 1 zeigt den Aufruf von history mit dem Parameter 4, was die Ausgabe auf die letzten vier Einträge beschränkt. Der Aufruf funktioniert analog zu history | tail -4, fällt aber deutlich kürzer aus. In der Ausgabe gibt die Zahl vor jeder Zeile an, um den wievielten Eintrag in der Historie es sich handelt. Die Zahlen spielen dann eine Rolle, wenn Sie planen, das zugehörige Kommando darüber zu referenzieren und wiederholt auszuführen.

Listing 1

Letzte vier Einträge

$ history 4
2000  ls bash-historie/
2001  man history
2002  df -h
2003  history 4

Das recht unscheinbare Werkzeug Fc dient dazu, Kommandos aus der History aufzulisten, zu bearbeiten und erneut auszuführen. Listing 2 zeigt den Aufruf des Tools mit den Parametern -l 1997:*2000, der die vier Einträge 1997 bis 2000 aus der Historie in chronologischer Reihenfolge liefert. Um die Ausgabe umzudrehen, also das jüngste Kommando oben anzuzeigen, verwenden Sie entweder den zusätzlichen Parameter -r oder ergänzen den Aufruf um eine Pipe gefolgt von tac, tippen also fc -l 1997:*2000 | tac.

Listing 2

Ausgabe mit Fc

$ fc -l 1997 2000
1997  chromium
1998  ncal
1999  ncal -w
2000  cd

Nicht zu vergessen sind Egrep, Fgrep und Grep, die ebenfalls die passenden Zeilen aus der Historie herausfiltern. So ermittelt der Aufruf history | fgrep xpdf alle bisherigen Aufrufe von Xpdf. Ist das richtige Kommando in der Historie identifiziert, genügt die Eingabe von !Nummer.

Das gelingt auch ohne externe Werkzeuge über die Tastatur. Viele Nutzer verwenden lediglich die Pfeiltasten nach oben und unten, um in der Historie Befehl für Befehl vor- oder zurückzublättern. Das genügt im Alltag, sofern das gewünschte Kommando kurz vorher aufgerufen wurde. Bei länger zurückliegenden Eingaben und besonders, wenn es wirklich schnell gehen muss, erweist sich das als langsam und wenig zielführend. Die Bash bietet hier bessere Möglichkeiten.

Suche in der History

Neben der Möglichkeit, ein Kommando über die Nummer des Eintrags in der History-Datei zu referenzieren, gibt es weitere Wege [4]. Die Tabelle “Shortcuts für die Bash-Historie” fasst sie zusammen. Während !!, !String und !N sich weitreichender Bekanntheit erfreuen, trifft das für die restlichen Varianten nicht zu.

Aktion

Bedeutung

[Strg]+[P]

Gehe ein Kommando in der Historie zurück (analog zu [Pfeil-oben]).

[Strg]+[N]

Gehe ein Kommando in der Historie weiter (analog zu [Pfeil-unten]).

[Alt]+[<]

Springe zum Anfang der Historie.

[Alt]+[Umschalt]+[<]

Springe zum Ende der Historie.

[Umschalt]+[1][Umschalt]+[1][Eingabe]

Führe das vorherige Kommando wiederholt aus.

[Umschalt]+[1]String,[Eingabe]

Führe das vorherige Kommando wiederholt aus, das mit String beginnt.

[Umschalt]+[1][Umschalt]+[ß]String[Umschalt]+[ß][Eingabe]

Führe das Kommando aus, das String enthält.

[Umschalt]+[1]N[Eingabe]

Führe das N-te Kommando ausgehend vom Anfang der Aufzeichnungen aus.

[Umschalt]+[1][-]N[Eingabe]

Führe das N-te Kommando ausgehend vom Ende der Aufzeichnungen aus.

[Strg]+[R]

Rückwärtssuche in der Historie.

[Strg]+[S]

Vorwärtssuche in der Historie.

[Strg]+[O]

Führe ein zuvor mittels Vor- oder Rückwärtssuche gefundenes Kommando aus.

[Strg]+[G]

Abbruch der Vor- oder Rückwärtssuche.

Rückwärtssuche

Die Rückwärtssuche mittels [Strg]+[R] (“reverse incremental search”) spürt das zuletzt genutzte Kommando mit der angegebenen Zeichenkette auf. Gesucht wird dabei nach der exakt angegebenen Zeichenkette und nicht nach Mustern auf der Basis regulärer Ausdrücke. Der Aufruf aus Listing 3 zeigt die Suche nach “xp”, die als Resultat den früheren Aufruf von xpdf ausgibt.

Listing 3

Rückwärtssuche

$ (reverse-i-search)`xp': history | fgrep xpdf

Ein erneutes [Strg]+[R] reist weiter in die Vergangenheit und sucht ausgehend vom aktuellen Suchtreffer den vorangehenden. Mit [Strg]+[O] führen Sie den Suchtreffer direkt als Kommando aus, via [Esc] wird er hingegen ausschließlich angezeigt und erst nach einer Bestätigung ausgeführt. Das ermöglicht sowohl eine Kontrolle als auch das Ändern des Kommandos.

Vorwärtssuche

Die Vorwärtssuche steht zwar im Bash-Handbuch [5], funktioniert aber häufig nicht auf Anhieb. Um herauszufinden, woran das liegt und wie Sie sie zum Funktionieren bringen, bedarf es eines Blicks in die Vergangenheit der Terminals und deren Steuerung. Das Zauberwort heißt hier Software Flow Control. Bei seriellen Schnittstellen wird sie mittels des Kommandos XON aktiviert und mit XOFF wieder ausgeschaltet. Linux-Terminals nutzen diese Technologie bis heute zum Steuern der Ein- und Ausgabe der Zeichen.

Informationen zu den aktuellen Terminaleinstellungen liefert das Kommando stty beim Aufruf mit dem Parameter -a (Listing 4). Die erste Zeile der resultierenden Ausgabe liefert Angaben zur Übertragungsleistung sowie der Terminalgröße in Zeilen und Spalten, darunter folgen Einstellungen zu den gesendeten Steuerzeichen.

Listing 4

Terminaleinstellungen anzeigen

$ stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -flusho -extproc

Viele Terminals verbergen quasi die Flusskontrolle. Die Tastenkombination [Strg]+[S] unterbricht die Terminalsitzung, während [Strg]+[Q] sie wieder fortsetzt. Da heute kaum noch jemand diese Eigenschaft benötigt, lässt sie sich über den Befehl stty -ixoff abschalten. Der komplementäre Aufruf lautet stty -ixon. Anschließend funktioniert auch die Vorwärtssuche (“incremental search”) mittels [Strg]+[S] (Listing 5). Dabei gilt analog zur Rückwärtssuche, dass nur eine Suche nach festen Zeichenketten gelingt, nicht aber eine Formulierung mittels regulärer Ausdrücke.

Listing 5

Vorwärtssuche

$ stty -ixon
$ (i-search)`xp': history | fgrep xpdf

Später geöffnete Konsolen erben die neu aktivierte Eigenschaft nicht. Um das Feature permanent zu aktivieren, müssen Sie die Bash-Konfiguration modifizieren. Dazu ergänzen Sie die Datei ~/.bash_profile um die Zeile stty -ixon. Nach der Änderung starten Sie die Bash neu oder lesen die geänderte Konfigurationsdatei mit dem Kommando source erneut ein.

Zsh-History

Schon seit geraumer Zeit hat sich die Z-Shell neben der Bash fest etabliert. Wie eingangs schon erwähnt, agiert sie ähnlich wie die Bash. Mehr Details dazu finden sie im Linux Handbook unter dem Titel “Using Command History in Zsh” [3].

In der Grundeinstellung unter Debian GNU/Linux fehlt der Zsh jedoch eine aktive Historie. Haben Sie das Plugin Oh My Zsh [9] installiert, sind Sie bereits voll ausgestattet und es bedarf gegebenenfalls nur noch etwas Finetuning an der Konfiguration. Die Tabelle “History-Variablen in der Zsh” listet eine Auswahl von Zsh-Konfigurationsvariablen auf. Eine vollständige Übersicht aller Optionen finden Sie auf Github [6].

Listing 6 stellt eine minimale Konfiguration für die Zsh zusammen, die 10 000 Zeilen pro Sitzung in der Datei .zsh_history speichert. Diese Konfiguration legen Sie in der Datei .zshrc ab und aktivieren sie in einer bereits laufenden Zsh mit dem Kommando source .zshrc.

Name

Beschreibung

HISTFILE

Name der Datei, in der die Zsh die Historie speichert.

HISTSIZE

Anzahl der Kommandos, die sich die Zsh im Speicher für die aktuelle Sitzung merkt.

SAVEHIST

Anzahl der Kommandos, die die Zsh in der Historie speichert.

SHARE_HISTORY

Teile die Historie mit jeder anderen Zsh-Sitzung.

APPEND_HISTORY

Füge die Historie an die bestehende Historie an, statt diese zu ersetzen.

EXTENDED_HISTORY

Füge jedem Eintrag einen Zeitstempel hinzu.

INC_APPEND_HISTORY

Warte nicht auf die Beendigung der Zsh, um die Historie zu ergänzen.

Listing 6

Zsh-Konfiguration

HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt APPEND_HISTORY \
       EXTENDED_HISTORY \
       INC_APPEND_HISTORY

Ergänzungen

Im Paketfundus von Debian GNU/Linux und Ubuntu finden sich beiden Pakete Hstr [7] für eine erweiterte Historie und Atuin [8] für eine Historie mit SQL-Datenbank. Ersteres liest die History ein und erstellt daraus ein Auswahlmenü. Atuin ersetzt die bestehende Historie durch eine SQLite-Datenbank, die sich bei Bedarf zudem zentralisieren lässt. Damit ist die Historie in einem Netzwerk an einem Ort zu erreichen und lässt sich mit anderen Instanzen synchronisieren.

Fazit

Abschließend lässt sich mit Fug und Recht behaupten: Die Historie der Shell ist ein sehr nützliches Feature. Mit diversen Werkzeugen und verschiedenen Tastenkombinationen greifen Sie auf einzelne Einträge daraus zu. So schön die Aufzeichnungen sind, so wenig sagen sie allerdings über den Erfolg oder Misserfolg eines Aufrufs aus. In einem Folgeartikel stellen wir Ihnen vor, wie Sie nicht nur die einzelnen Kommandos wieder abspielen, sondern auch deren Ausgaben im Terminal festhalten. (tle)

Danksagung

Der Autor bedankt sich bei Axel Beckert für seine Hilfe und kritischen Anmerkungen beim Erstellen des Artikels.

Über den Autor

Frank Hofmann arbeitet zumeist von unterwegs aus als Entwickler, Trainer und Autor. Bevorzugte Arbeitsorte sind Berlin, Genf und Kapstadt. Er gehört zu den Verfassern des Debian-Paketmanagement-Buchs [10].

Infos

  1. Shell: Heike Jurzik, “Shell-Tipps”, EL 01/2018, S. 100, https://www.linux-community.de/39705

  2. “Configuring BASH History”: https://datawookie.dev/blog/2023/04/configuring-bash-history/

  3. “A Complete Guide to Linux Bash History”: https://www.cherryservers.com/blog/a-complete-guide-to-linux-bash-history

  4. “Commands For Manipulating The History”: https://www.gnu.org/software/bash/manual/html_node/Commands-For-History.html

  5. “Using Command History in Zsh”: https://linuxhandbook.com/zsh-command-history/

  6. Oh My Zsh: https://ohmyz.sh

  7. “Zsh History Options”: https://postgresqlstan.github.io/cli/zsh-history-options/

  8. Hstr: https://github.com/dvorka/hstr

  9. Atuin: Ferdinand Thommes, “Magische Schildkröte”, LU 09/2022, S. 34, https://www.linux-community.de/47408

  10. Debian-Paketmanagement-Buch: https://dpmb.org

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 01/2025 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben