von Matthias Dillier

Die ‹magische› Shell-History: Atuin

Linux, Shell

Shell-History

Wer mit einer Shell unter Linux arbeitet, weiss schnell die History-Funktion zu schätzen. Statt Befehle immer wieder einzutippen, verwendet man die Pfeiltaste, um alte Befehle zurück zu holen oder man wiederholt Befehle aus der History mit «!<Befehlsnummer>». Auch die Kombination history | grep Suchstring kommt sicher vielen bekannt vor.

In diesem Blogbeitrag stelle ich eine bessere und mächtigere Variante vor, mit der Shell-History zu arbeiten, indem man das Werkzeug Atuin verwendet.

Was ist Atuin

Auf der Webseite mit der Dokumentation wird Atuin wie folgt beschrieben:

Atuin replaces your existing shell history with a SQLite database, and records additional context for your commands. With this context, Atuin gives you faster and better search of your shell history.

Additionally, Atuin (optionally) syncs your shell history between all of your machines. Fully end-to-end encrypted, of course.

Atuin ist ein Ersatz der Shell-History durch eine Datenbank, der nützliche Erweiterungen und, wenn das gewünscht wird, sogar die Synchronisation der Shell-History über mehrere Systeme hinweg bietet.

Atuin ist OpenSource-Software und wird nur durch Sponsoren unterstützt. Die Entwicklerinnen sind froh um Unterstützung.

Unterstützte Shells

Atuin unterstützt die folgenden Shell-Varianten:

  • zsh
  • bash
  • fish
  • nushell
  • xonsh

Weiterentwicklung

Im Zusammenhang mit Atuin werden inzwischen auch Werkzeuge entwickelt, mit denen Shell-Konfigurationsfiles zwischen Rechnern synchronisiert werden können, um Umgebungsvariablen und Aliases konsistent auf verschiedenen Rechnern verwenden zu können. (Siehe: https://docs.atuin.sh/guide/dotfiles/)

Ein weiteres Werkzeug ist Atuin Desktop, das Dokumentation und ausführbare Programmsequenzen zusammenbringen will. (Siehe: https://github.com/atuinsh/desktop)

Installation

Für die Installation von Atuin gibt es ein Skript, das mit folgendem Befehl heruntergeladen und ausgeführt werden kann:

curl --proto '=https' --tlsv1.2 -LsSf https://setup.atuin.sh | sh

Das Kommando ergänzt z.B. die Konfigurationsdatei .bashrc für bash mit dem Befehl

eval "$(atuin init bash)"

zum Start des Initialisierungs-Skripts von Atuin beim Starten der bash-Shell. Die Pfadvariable sollte in .bashrc mit dem atuin-Befehl ergänzt werden:

PATH="$PATH:~/.atuin/bin"

Es wird empfohlen, für die bash-Shell auch ble.sh zu installieren.

ble.sh ist ein bash-Shell Zeileneditor, der Syntax-Highlighting (auch mit Farben), Kommandovervollständigung, einen vim-Editiermodus und weitere Features bietet. Atuin kann ihn für die Kommandovervollständigung und die farbige Darstellung von Befehlen brauchen. Der aktuelle Buildstand von ble.sh kann mit folgendem Befehl (alles auf einer Zeile) installiert werden:

curl -L https://github.com/akinomyoga/ble.sh/releases/download/nightly/ble-nightly.tar.xz | tar xJf -bash ble-nightly/ble.sh --install ~/.local/share

In .bashrc sollte ble.sh vor dem Start von Atuin mit folgender Zeile auch gleich gestartet werden:

source -- ~/.local/share/blesh/ble.sh

Bestehende Kommandhistorie

Atuin kann nach der Installation die bestehende Shell-Kommandhistorie importieren und dann wie jene neuer Kommandos verwenden. Der Import geschieht mit folgendem Kommando:

atuin import auto

Hier noch die Dokumentation des Import-Befehls:

$ atuin help import
Import shell history from file

Usage: atuin import <COMMAND>

Commands:
  auto          Import history for the current shell
  zsh           Import history from the zsh history file
  zsh-hist-db   Import history from the zsh history file
  bash          Import history from the bash history file
  replxx        Import history from the replxx history file
  resh          Import history from the resh history file
  fish          Import history from the fish history file
  nu            Import history from the nu history file
  nu-hist-db    Import history from the nu history file
  xonsh         Import history from xonsh json files
  xonsh-sqlite  Import history from xonsh sqlite db
  help          Print this message or the help of the given subcommand(s)

Verwendung und gespeicherte Daten

Atuin kann via Konfigurationsdateien den eigenen Bedürfnissen angepasst werden. Die Angaben hier beziehen sich auf die Defaultkonfiguration nach der Installation von Atuin in der bash-Shell.

Während der Verwendung der Shell speichert Atuin in der Datenbank die folgenden Angaben, die dann in Atuin gebraucht werden können (siehe: https://docs.atuin.sh/guide/basic-usage/):

  • verwendetes Kommando
  • Verzeichnis, in dem das Kommando aufgerufen wurde
  • Zeitpunkt des Kommandoaufrufs und die Ausführungszeit
  • Returnwert des Kommandos
  • Host- und Usernamen
  • Shell-Session, in der das Kommando aufgerufen wurde

TUI, Terminal User Interface

Mit der Pfeiltaste gegen oben oder mit <ctrl><r> kann das User Interface gestartet werden. Hier ein Screenshot als Beispiel:

Atuin-Befehle in der Shell

Zuoberst sieht man auch gleich die wichtigsten Shortcuts:

  • <esc> um Atuin zu verlassen
  • <tab> um den Befehl auf die Kommandozeile zu holen, um ihn dort anzupassen
  • <enter> um den Befehl direkt auszuführen

Mit der Pfeiltaste nach oben oder unten kann man durch die Befehle navigieren.

Mit <ctrl><R> kann man den Scope wechseln zwischen [GLOBAL] wie im Screenshot und [HOST], [SESSION] oder [DIRECTORY]. Es werden dann jeweils alle Befehle aus der History oder nur jene von demselben Host, jene aus der aktuellen Session oder jene, die im aktuellen Verzeichnis aufgerufen wurden, angezeigt.

<ctrl><o> öffnet den ‹Inspektor›. Mit dem Inspektor kann man die Angaben, die zum aktuellen Befehl gespeichert sind, anschauen und auch den entsprechenden Eintrag aus der Atuin-Datenbank löschen.

<Alt><#>, wobei # für die Nummer (1 bis 9) des Befehls in der Liste steht, ruft den Befehl mit dieser Nummer auf.

Wenn man einfach beginnt zu tippen, so wird in der History mit einer ‹fuzzy›-Suche nach dem eingetippten Text gesucht und es werden die gefundenen Befehle angezeigt.

Atuin-Befehle in der Shell

Mit <ctrl><s> kann man zwischen den verschiedenen Suchmodi PREFIX, FULLTEXT und FUZZY wechseln. PREFIX würde im Beispiel kein Resultat liefern, FULLTEXT nur die untersten Befehle, bei denen der Suchtext rot umrandet ist und FUZZY hilft meist auch dann, wenn man den genauen Befehl nicht mehr weiss.

Shortcuts

Die Default-Shortcuts werden in der Dokumentation wie folgt beschrieben:

ShortcutAction
enterExecute selected item
tabSelect item and edit
ctrl + rCycle through filter modes
ctrl + sCycle through search modes
alt + 1 to alt + 9Select item by the number located near it
ctrl + c / ctrl + d / ctrl + g / escReturn original
ctrl + yCopy selected item to clipboard
ctrl + ⬅️ / alt + bMove the cursor to the previous word
ctrl + ➡️ / alt + fMove the cursor to the next word
ctrl + b / ⬅️Move the cursor to the left
ctrl + f / ➡️Move the cursor to the right
ctrl + a / homeMove the cursor to the start of the line
ctrl + e / endMove the cursor to the end of the line
ctrl + backspace / ctrl + alt + backspaceRemove the previous word / remove the word just before the cursor
ctrl + delete / ctrl + alt + deleteRemove the next word or the word just after the cursor
ctrl + wRemove the word before the cursor even if it spans across the word boundaries
ctrl + uClear the current line
ctrl + n / ctrl + j / ⬆️Select the next item on the list
ctrl + p / ctrl + k / ⬇️Select the previous item on the list
ctrl + oOpen the inspector
page downScroll search results one page down
page upScroll search results one page up
⬇️ (with no entry selected)Return original or return query depending on settings
⬇️Select the next item on the list

Suche

Atuin bietet viele Suchmöglichkeiten, um Befehle in der History zu finden. Ein kleines Beispiel ist die folgende Suche, die den ältesten sudo-Befehl aus der History anzeigt:

atuin search --limit 1 --reverse sudo

Die Suche in Atuin ist auf der Webseite wie folgt beschrieben:

Atuin search supports wildcards, with either the * or % character. By default, a prefix search is performed (ie, all queries are automatically appended with a wildcard).

ArgDescription
–cwd/-cThe directory to list history for (default: all dirs)
–exclude-cwdDo not include commands that ran in this directory (default: none)
–exit/-eFilter by exit code (default: none)
–exclude-exitDo not include commands that exited with this value (default: none)
–beforeOnly include commands ran before this time(default: none)
–afterOnly include commands ran after this time(default: none)
–interactive/-iOpen the interactive search UI (default: false)
–humanUse human-readable formatting for the timestamp and duration (default: false)
–limitLimit the number of results (default: none)
–offsetOffset from the start of the results (default: none)
–deleteDelete history matching this query
–delete-it-allDelete all shell history
–reverseReverse order of search results, oldest first
–format/-fAvailable variables: {command}, {directory}, {duration}, {user}, {host}, {time}, {exit} and {relativetime}. Example: —format “{time} – [{duration}] – {directory}$\t{command}“
–inline-heightSet the maximum number of lines Atuin’s interface should take up
–help/-hPrint help

Interessant ist die Möglichkeit, mit --exit oder --exclude-exit vergangene Kommandos mit einem bestimmten Exitcode oder beispielsweise jene, die nicht erfolgreich ausgeführt wurden
(--exclude-exit 0), zu suchen.

Statistik

Mit atuin stats bekommt man eine einfache Statistik zu den Befehlen in der History. Mit atuin history list werden die gespeicherten Befehle und Daten ausgegeben, wobei das Format der Ausgabe mit Parametern angepasst werden kann.

Update

Wenn Zugriff zum Internet besteht, so lässt sich ein Update ganz einfach mit folgendem Befehl durchführen:

atuin-update

Support

Für Fragen zu Atuin gibt es ein Forum: https://forum.atuin.sh/

Im Forum können auch Ideen für Weiterentwicklungen vorgeschlagen werden.

Synchronisation zwischen Rechnern

Es ist möglich, die History mit Atuin über Rechnergrenzen hinweg zu speichern und zu synchronisieren. Dazu braucht es für Atuin eine Datenbank auf einem Synchronisationsserver in der Cloud oder auf einem eigenen Rechner, die dann von verschiedenen Rechnern aus verwendet wird. Der Datentransport von und zur Datenbank wird dabei sicher verschlüsselt.

Auf die Details wird in diesem Blogbeitrag nicht eingegangen. Sie sind auf der Atuin-Webseite beschrieben: https://docs.atuin.sh/self-hosting/server-setup.

Fazit

Das OpenSource-Werkzeug Atuin bietet eine verbesserte und einfach zu bedienende Shell-History mit vielen Suchmöglichkeiten. Es ist schnell installiert und es kann bei Bedarf auch über Rechnergrenzen hinweg sicher verwendet werden. Ein rundum gelungenes kleines Werkzeug, das die Arbeit mit der Shell erleichtert.

Foto des Autors

Matthias Dillier

Mathematiker, Informatiker und Saxophonist mit langjähriger Erfahrung in diversen Bereichen der Informatik. Aktuell befasst er sich besonders mit Monitoring, Problemanalysen, Logauswertungen, Grafiken und der Automatisierung von Betriebsprozessen.

Hinterlassen Sie einen Kommentar

zwanzig + 1 =