Atuin ergänzt die History-Funktion der Shell um einige praktische Abfragen und synchronisiert sie zudem netzweit.
“Wie war noch gleich dieser lange Befehl, den ich letztes Jahr auf meinem Notebook eingegeben habe und der mir alle installierten Pakete anzeigt?” Kommen Fragen wie diese Ihnen allzu vertraut vor, sollten Sie weiterlesen.
Unix-Shells wie die Bash, Fish oder Zsh besitzen bereits grundlegende Funktionen, um die zuletzt genutzten Befehle in der Kommandozeile erneut aufzurufen. Mit der Pfeiltaste nach oben lässt sich die Befehlshistorie durchstöbern, jeder Tastendruck blättert einen Eintrag zurück.
Etwas auskunftsfreudiger und bei länger zurückliegenden Befehlen komfortabler ist die History-Funktion der Bash. Erstmals tauchte sie 1978 in Unix in der C-Shell auf und verbreitete sich von dort aus in viele Kommandozeileninterpreter bis hin zu Microsofts command.exe. Ein ausführliches Handbuch [1] zur History-Funktion findet sich auf der Webseite von DigitalOcean (Abbildung 1).

Abbildung 1: Der History-Befehl listet den Verlauf der eingegebenen Kommandos auf. Durch Eingeben eines Ausrufezeichens gefolgt von der entsprechenden Nummer lassen sich Befehle aus der Liste wieder ausführen.
Das History-Tool Atuin [2] geht noch einige Schritte weiter. Es ersetzt den bestehenden Shell-Verlauf durch eine SQLite-Datenbank, importiert den bisherigen Verlauf, bietet mehr Suchmöglichkeiten und zeichnet zusätzlichen Kontext zu den in Atuin genutzten Befehlen auf.
Außerdem synchronisiert es die aufgezeichnete History Ende-zu-Ende-verschlüsselt über einen externen Server auf andere Geräte im Netzwerk. Dahinter steckt der Gedanke, dass Anwender mit mehreren Rechnern in ihrem Netzwerk nicht nur den Shell-Verlauf einer einzelnen Sitzung oder eines einzelnen Rechners nutzen, sondern den gesamten Verlauf aller synchronisierten Geräte abrufen können. Dabei unterstützt das Tool derzeit die Shells Bash, Fish und Zsh.
Der Name Atuin rührt von einer Schildkröte her, die in den Romanen Sir Terry Pratchetts die Scheibenwelt durchs All trägt. In Rust geschrieben läuft Atuin entweder als Client auf dem Desktop oder selbst gehostet als Client-Server-Anwendung. Wählen Sie die zweite Option, findet die Synchronisation über Ihren Server statt, ansonsten über einen Server des Projekts. Wünschen Sie keine Synchronisation, schalten Sie die standardmäßig aktivierte Funktion in den Einstellungen ab.
Installation
Einige Distributionen bringen Atuin in den Paketquellen mit, darunter Alpine Linux, Arch Linux, NixOS und Manjaro. Installieren Sie Atuin über ein Distributionspaket, dann müssen Sie anschließend noch drei Befehle ausführen, um die für das Tool nötigen Hooks in die Datei .bashrc zu schreiben (Listing 1).
Listing 1
Hooks in .bashrc schreiben
$ curl https://raw.githubusercontent.com/rcaloras/bash-preexec/master/bash-preexec.sh -o ~/.bash-preexec.sh $ echo ' -f ~/.bash-preexec.sh && source ~/.bash-preexec.sh' >> ~/.bashrc $ echo 'eval "$(atuin init bash)"' >> ~/.bashrc
Anwender von auf Debian basierenden Distributionen beziehen ein aktuelles Binärpaket der aktuellen Version 0.10 über die Github-Seite des Projekts [3]. Für alle anderen Distributionen lässt sich das Tool über ein Skript installieren (Abbildung 2), das Sie wie in der ersten Zeile von Listing 2 gezeigt aufrufen.

Abbildung 2: Mithilfe eines Skripts lässt sich Atuin einsatzbereit installieren. Verwenden Sie ein Binärpaket, braucht es etwas Nacharbeit.
Listing 2
Atuin installieren
$ bash <(curl https://raw.githubusercontent.com/ellie/atuin/main/install.sh) [...] $ atuin register -u User -e E-Mail -p Passwort $ atuin import auto $ atuin sync [...] $ atuin login -u User -p Passwort -k Key
Den bisherigen Befehlsverlauf der Shell importieren Sie über das Kommando atuin import auto. Damit ist Atuin in dieser Konstellation einsatzbereit. Soll eine Synchronisation mit anderen Geräten über den Server von Atuin stattfinden, rufen Sie das Skript auf und führen danach die Befehle aus den Zeilen 3 bis 5 von Listing 2 aus.
Alternativ lässt sich zur Installation auf einem Server ein Docker-Image nutzen [4]. Für ein einfaches Ausrollen steht eine Docker-Compose-Datei bereit [5].
Konfiguration
Atuin legt im Home-Verzeichnis des Anwenders an zwei Stellen Dateien an. Die SQLite-Datenbank findet sich unter .local/share/atuin/. Die Konfigurationsdatei (Abbildung 3) im TOML-Format [6] platzieren Sie in .config/atuin/. Im Fall der Synchronisation landet zusätzlich der Key zur Verschlüsselung im Verzeichnis ~/.local/share/atuin/ und lässt sich über den Befehl atuin key abrufen. Sie benötigen ihn für das Login auf einem synchronisierten Rechner über den Befehl aus der letzten Zeile von Listing 2.

Abbildung 3: Atuin lässt sich schnell konfigurieren. Wichtig ist, sich für oder gegen das Synchronisieren zu entscheiden. Dafür gibt die Konfiguration den offiziellen Atuin-Server vor. Hosten Sie selbst, muss hinter sync_address Ihre Server-Adresse stehen.
Die TOML-Datei fürs Installieren auf einem Server erstellen Sie unter ~/.config/atuin/ als server.toml. In der Konfigurationsdatei für den Client auf dem Desktop lässt sich unter anderem der Pfad zur Datenbank ändern, die Synchronisation deaktivieren, deren Frequenz festlegen und ein eigener Server verlinken. Als Synchronisationsfrequenz gibt die Dokumentation eine Stunde an, die Konfigurationsdatei setzt sync_frequency jedoch auf fünf Minuten. Setzen Sie stattdessen eine Null ein, synchronisiert Atuin nach jedem Befehl.
Beim Suchmodus haben Sie die Wahl zwischen den Optionen prefix, fulltext und fuzzy; in der Vorgabe kommt prefix zum Einsatz. Die Volltextsuche funktioniert wie eine Suchmaschine und versucht, die engste Übereinstimmung mit dem Suchbegriff zu identifizieren. Die Syntax der Fuzzy-Suche listen die Entwickler in der Dokumentation [7] auf.
Für die Suche können Sie zusätzlich einen Filter-Modus [8] mit den Optionen GLOBAL, HOST, SESSION und DIRECTORY aufsetzen, die die Ergebnisse entsprechend eingrenzen.
Um sich anfangs hinsichtlich der verfügbaren Optionen zu orientieren, nutzen Sie wie üblich den Hilfe-Befehl atuin --help. Im einfachsten Fall liefert der Aufruf atuin search das gewünschte Ergebnis (Abbildung 4).

Abbildung 4: Im normalen Modus geben Sie das Stichwort für die Suche bereits mit dem Aufruf von Atuin an.
Interaktiver Modus
Atuin verfügt über einen interaktiven Modus, den Sie mittels atuin search -i aufrufen und mit [Strg]+[C] wieder verlassen. Ohne weitere Argumente zeigt der Befehl den Verlauf der eingegebenen Kommandos, wobei das zuletzt eingegebene zuunterst steht (Abbildung 5). Die Anzahl der gezeigten Befehle richtet sich nach der Angabe für die HISTFILESIZE in der .bashrc. Die Zahl der gespeicherten Befehle ist von Haus aus auf 500 begrenzt.

Abbildung 5: Der interaktive Modus verrät oben rechts, wie viele Befehle angezeigt werden. In der Eingabezeile unten lässt sich der Filter ändern und durch Eingeben von Zeichenfolgen die Suche einschränken.
Mit dem Mausrad oder den Pfeiltasten bewegen Sie sich durch die Liste der Befehle. Die Zahlen links vor den Kommandos erlauben per [Alt]+[Ziffer] direkt zum jeweiligen Befehl zu springen. Vor jedem Befehl zeigt Ihnen Atuin außerdem an, wie lange dessen Ausführung gedauert hat. Am unteren Rand des Fensters befindet sich eine Eingabezeile, mit der Sie die Ausgabe durch Stichwörter eingrenzen (Abbildung 6). Geben Sie dort etwa apt ein, erscheinen nur noch Befehle, die dieses Stichwort enthalten.
![Abbildung 6: Hier filtert der eingegebene Buchstabe <code>d</code> die Ausgabe auf damit beginnende Befehle. Mit <span class="key-combo">[Strg]+[R]</span> grenzen Sie den Filtermodus von <code>GLOBAL</code> weiter ein.](/wp-content/uploads/2022/09/b06-2-300x160.jpg)
Abbildung 6: Hier filtert der eingegebene Buchstabe d die Ausgabe auf damit beginnende Befehle. Mit [Strg]+[R] grenzen Sie den Filtermodus von GLOBAL weiter ein.
Ganz links in der Zeile sehen Sie standardmäßig die Filterangabe GLOBAL. Der Begriff steht für die Anzeige der Befehle aus allen synchronisierten Verläufen. Mit [Strg]+[R] limitieren Sie das mit HOST auf den gerade genutzten Rechner, mit SESSION auf die laufende Sitzung oder mit DIRECTORY auf Befehle, die aus dem derzeit aktiven Verzeichnis aufgerufen wurden.
Normale Suche
Indem Sie Atuin beim Aufruf weitere Argumente mitgeben, filtern Sie unter anderem nach Exit-Codes, beschränken die Ergebnisse also beispielsweise auf erfolgreich abgeschlossene Befehle. Daneben können Sie die Ausgabe über das Angeben von Verzeichnissen steuern, aus denen Befehle eingegeben wurden. Die Suche lässt sich zudem auf bestimmte Zeiträume einschränken (Abbildung 7). Einige Beispiele dazu finden Sie in der Tabelle “Beispiele für Abfragen mit Atuin”. Weitere Parameter lesen Sie in der Dokumentation der Suchfunktion auf Github nach [9].

Abbildung 7: Die Suchergebnisse lassen sich auf verschiedene Arten verfeinern. Hier geht es um Befehle, die nach dem 1. Juli 2022 eingegeben wurden und mit Exit-Code 1 endeten.
|
|
Zeigt an welche eingegebenen Befehle nicht erlaubt waren, meist wegen fehlender Berechtigung (siehe Tabelle “Exit-Codes”). |
|
|
Bewirkt das Gegenteil des obigen Befehls. |
|
|
Zeigt Befehle an, die nach dem 1. Juli 2022 eingegeben und in der Form nicht ausführbar waren. Analog lässt sich der Parameter |
|
|
Zeigt Befehle an, die vor dem 1. Juli 2022 erfolgreich aus dem derzeitigen Verzeichnis ( |
|
|
Erstellt eine Befehlsvervollständigung ( |
|
|
Erstellt einen Aktivitätsgraphen ähnlich dem für Github-Aktivitäten. |
|
Exit-Code |
Bedeutung |
|---|---|
|
0 |
Erfolg |
|
1 |
Operation nicht erlaubt |
|
2 |
Verzeichnis existiert nicht |
|
3 |
Prozess existiert nicht |
Eher Unterhaltungswert hat der Befehl atuin stats all, der eine Gesamtstatistik ausgibt und sich tageweise zum Beispiel mit atuin stats day last friday oder durch Angeben eines Datums nutzen lässt (Abbildung 8). Wie Sie einen Aktivitätsgraphen im Github-Stil erzeugen, sehen Sie in der letzten Zeile der Tabelle “Beispiele für Abfragen mit Atuin”. Das setzt allerdings die Registrierung für den öffentlichen Sync-Server oder den Betrieb eines eigenen Servers voraus.

Abbildung 8: Der Befehl stats zeigt auf, wie viele Befehle Sie eingegeben und welchen davon Sie am häufigsten verwendet haben. Auch hier lässt sich das Resultat zeitlich eingrenzen.
Fazit
Es gibt viele Werkzeuge, die grundlegende History-Funktionen auf unterschiedliche Weise erweitern. Das erstmals im April 2021 veröffentlichte Atuin legt den Schwerpunkt auf die Synchronisation von Befehlsverläufen auf unterschiedlichen Rechnern. Die Ergebnisse können Sie global über alle synchronisierten Rechner hinweg nutzen. Sie lassen sich aber auch nach Rechner, der aktuellen Sitzung oder dem Verzeichnis filtern, von denen aus sie ursprünglich aufgerufen wurden.
Die Dokumentation ist zwar noch ausbaufähig, ansonsten tut Atuin aber genau, was es soll. Direkte Unterstützung zu dem Tool erhalten Sie bei Bedarf im Atuin-Kanal auf Discord [10]. Falls Sie sich dafür interessieren, auf welchem Weg Projekte wie dieses zustande kommen, erfahren Sie mehr dazu in einem Interview mit Ellie Huxtable, der Entwicklerin hinter Atuin [11]. (csi/jlu)
Infos
- Bash-History: https://www.digitalocean.com/community/tutorials/how-to-use-bash-history-commands-and-expansions-on-a-linux-vps
- Atuin: https://github.com/ellie/atuin
- Debian-Paket: https://github.com/ellie/atuin/releases/tag/v0.10.0
- Docker-Image: https://github.com/ellie/atuin/pkgs/container/atuin
- Docker Compose: https://github.com/ellie/atuin/commit/a9d1ece0cb2090b54668765f70ec00cd2b3a8554#diff-e45e45baeda1c1e73482975a664062aa56f20c03dd9d64a827aba57775bed0d3
- TOML: https://de.wikipedia.org/wiki/TOML
- Fuzzy: https://github.com/ellie/atuin/blob/main/docs/config.md#fuzzy-search-syntax
- Filtermodus: https://github.com/ellie/atuin/blob/main/docs/config.md#filter_mode
- Suche: https://github.com/ellie/atuin/blob/main/docs/search.md
- Atuin auf Discord: https://discord.gg/Fq8bJSKPHh
- Interview: https://console.dev/interviews/atuin-ellie-huxtable/





