Die Suche mit Strg+R zeigt immer nur einen Treffer und lässt euch raten, ob der gesuchte Befehl noch kommt. Vier Werkzeuge ersetzen sie durch eine Trefferliste: hstr, fzf, Atuin und McFly. Sie unterscheiden sich darin, was sie zusätzlich speichern, wie sie sortieren und ob sie die History zwischen mehreren Rechnern abgleichen können.
Die BASH History Suggest Box, heute hstr, habe ich 2014 im Blog und im LinuxUser vorgestellt. Seitdem ist die Einrichtung unter aktuellen Kerneln eine andere, und mit Atuin und McFly gibt es Werkzeuge mit eigener Datenbank. Alle vier laufen im Test unter TUXEDO OS, jedes der Tools hat seine eigenen Stärken und Schwächen.
Die Bordmittel für den Anfang
Die Bash bringt schon etwas mit: Strg+R startet die Rückwärtssuche, jeder weitere Druck springt zum nächsten, älteren Treffer. Das geht überall, auch auf dem Server per SSH. Debian und TUXEDO OS merken sich allerdings nur 1000 Befehle im Speicher und 2000 in der ~/.bash_history. Die Werte HISTSIZE und HISTFILESIZE in der ~/.bashrc lassen sich erhöhen.

Zwei Zeilen in der ~/.inputrc machen aus den Pfeiltasten eine Präfixsuche. Tippt ihr danach git und drückt Hoch, steht der letzte Befehl da, der mit git beginnt. Das genügt vielen. Wer nach einem Wort mitten im Befehl sucht, etwa nach einem Servernamen, braucht eines der folgenden Werkzeuge.
"\e[A": history-search-backward
"\e[B": history-search-forwardhstr: Trefferliste mit Löschfunktion
hstr (kurz für HiSToRy) öffnet bei Strg+R eine Liste aller Treffer. Mit Hoch und Runter wählt ihr aus, Tab holt den Eintrag zum Bearbeiten in die Kommandozeile, Entf löscht ihn aus dem Verlauf. Das hilft, wenn ihr einmal ein Passwort statt eines Befehls getippt habt. Strg+F markiert Favoriten, Strg+/ wechselt die Ansicht und Strg+E die Suchart, etwa auf exakte Treffer oder reguläre Ausdrücke.

In Debian, Ubuntu und TUXEDO OS liegt hstr in den Paketquellen, unter Arch Linux im AUR. Die passenden Einstellungen schreibt das Programm selbst in die ~/.bashrc. Danach öffnet Strg+R die Liste, und die Bash gleicht die History nach jedem Befehl mit der Datei ab.
sudo apt install hstr
hstr --show-configuration >> ~/.bashrc
source ~/.bashrcSeit Version 3.0 nutzt hstr nicht mehr den Systemaufruf TIOCSTI, den aktuelle Kernel meist abschalten. Dafür übernimmt Eingabe den Befehl nur in die Kommandozeile, erst ein zweiter Druck führt ihn aus. Ruft ihr hstr --show-configuration ohne Terminal auf, etwa per SSH, landet eine Fehlermeldung in der Ausgabe und damit in der ~/.bashrc. Version 3.3 behebt das, Debian liefert noch 3.1.
Unter Arch Linux scheiterte der Build von 3.3 am Prüfsummenvergleich. Der Tarball enthält denselben Quellcode, nur der Ordnername im Archiv unterscheidet sich, weil Upstream den Tag umbenannt hat. Abhilfe schafft das Löschen der zwischengespeicherten Datei, danach lädt yay den Tarball neu.
rm ~/.cache/yay/hstr/hstr-3.3.tar.gzfzf: unscharfe Suche für alles
fzf ist ein allgemeiner Fuzzy-Finder und bringt ein Skript für die Bash mit. Es belegt Strg+R für die History und Strg+T für Dateien. Die Suche ist unscharf: Die eingegebenen Buchstaben müssen nur in dieser Reihenfolge im Befehl vorkommen. Deshalb liefert apt auch curl und tar. Ein vorangestelltes Hochkomma sucht exakt. Das Paket gibt es in Debian, Ubuntu, TUXEDO OS und Arch Linux.
sudo apt install fzf
echo 'eval "$(fzf --bash)"' >> ~/.bashrc
Dafür fehlt fzf, was hstr kann: Einträge aus der History löschen oder Favoriten markieren. Wer fzf ohnehin nutzt, bekommt eine History-Suche gratis mit. Wer mehr will, schaut zu Atuin.
Atuin: die History als Datenbank
Atuin ersetzt die Textdatei durch eine SQLite-Datenbank und speichert zu jedem Befehl Zeitpunkt, Dauer, Rückgabewert und Verzeichnis. Dadurch lässt sich die Suche auf ein Projektverzeichnis, eine Sitzung oder einen Rechner eingrenzen. Zwischen den Filtern wechselt Strg+R in der Oberfläche. Atuin liegt in den Paketquellen von Debian, Ubuntu, TUXEDO OS und Arch Linux.
sudo apt install atuin
atuin import bash
echo 'eval "$(atuin init bash)"' >> ~/.bashrcDer Import übernimmt den vorhandenen Verlauf. Die Zeile in der ~/.bashrc legt Atuin auf Strg+R und die Taste Hoch, das lässt sich abschalten. Die Oberfläche füllt das ganze Terminal, kompakter wird sie mit inline_height = 10 in der Datei ~/.config/atuin/config.toml.

Das stärkste Argument für Atuin ist der Sync. Die History lässt sich Ende-zu-Ende-verschlüsselt zwischen Rechnern abgleichen, über den Dienst des Projekts oder über einen eigenen Server. Im Test lief ein eigener: Das Paket atuin-server genügt, als Datenbank reicht SQLite. Der Server liest seine Einstellungen aus der ~/.config/atuin/server.toml, die Clients bekommen seine Adresse in der config.toml.
host = "0.0.0.0"
port = 8888
open_registration = true
db_uri = "sqlite:///home/user/atuin-server/atuin.db"sync_address = "http://server:8888"Auf dem ersten Rechner legt atuin register ein Konto an, atuin key zeigt den Schlüssel. Auf dem zweiten meldet atuin login mit diesem Schlüssel an, danach gleicht atuin sync ab. Im Test kamen Befehle in beide Richtungen an, samt Rechnername in der Liste. In der Datenbank des Servers stand keiner davon im Klartext. Ohne TLS gehört der Server nur ins Heimnetz, sonst hinter einen Reverse-Proxy.
Fedora 44 liefert Atuin 18.12.1, der Server und der andere Rechner liefen mit 18.23. Der ältere Client konnte deren Einträge nicht lesen („unknown history version v2“) und blieb leer. Erst das aktuelle Release 18.24.6 von GitHub synchronisierte. Auf allen Rechnern sollte deshalb dieselbe, möglichst neue Version laufen.
Befehle mit Passwörtern filtert Atuin über secrets_filter, verlassen würde ich mich darauf nicht. Zuverlässiger ist ein Leerzeichen vor dem Befehl: Atuin übernimmt laut Dokumentation die Konvention ignorespace, solche Befehle landen nicht in der Datenbank.
McFly: Sortierung nach Verzeichnis
McFly ersetzt Strg+R ebenfalls und sortiert die Treffer laut Projektseite mit einem kleinen neuronalen Netz, das unter anderem das aktuelle Verzeichnis und die zuletzt ausgeführten Befehle berücksichtigt. Unter Arch Linux liegt es in extra. In den Paketquellen von TUXEDO OS fehlt es, im Test genügte das fertige Archiv von GitHub. Die einzelne Datei kommt nach ~/.local/bin, Root-Rechte braucht es nicht.
tar -xzf mcfly-v0.9.4-x86_64-unknown-linux-musl.tar.gz
cp mcfly ~/.local/bin/
echo 'eval "$(mcfly init bash)"' >> ~/.bashrcBeim ersten Start übernimmt McFly die ~/.bash_history. Eine Leiste oben nennt die Tasten: Esc beendet, Eingabe führt aus, Tab übernimmt zum Bearbeiten, F1 schaltet die Sortierung um, F2 löscht einen Eintrag, F3 zeigt Treffer aus allen Verzeichnissen. Die Länge der Liste steuert die Variable MCFLY_RESULTS.

Die Bedienung ist übersichtlicher als bei Atuin. Wie gut die Sortierung nach Verzeichnis arbeitet, lässt sich mit einer Demo-History nicht beurteilen, dafür braucht das Netz echte Gewohnheiten. Einen Sync-Dienst wie Atuin bringt McFly nach Angaben der Entwickler nicht mit.
Welches Werkzeug für wen?
Reichen euch die Bordmittel mit Präfixsuche, müsst ihr nichts installieren. Eine einfache Liste mit Löschfunktion und Favoriten bietet hstr, dessen Paketstände zwischen den Distributionen auseinanderliegen (Debian 3.1, Arch 3.3). Wer fzf ohnehin nutzt, bekommt die History-Suche mit. McFly passt, wenn ihr keinen Sync braucht und die Sortierung nach Verzeichnis mögt.
In meinen Augen lohnt sich Atuin vor allem, sobald ihr mehr als einen Rechner pflegt oder im Nachhinein wissen wollt, wo ihr einen Befehl abgesetzt habt. Dafür ist es auch das umfangreichste der vier Werkzeuge. Importiert eure alte History und schaut nach einer Woche, ob ihr noch zu Strg+R zurückgreift.
Welche Lösung nutzt ihr für die Bash-History? Reicht euch die Suche der Bash, oder habt ihr hstr ersetzt? Schreibt es gern in die Kommentare.

Schreibe einen Kommentar