Aller au contenu principal

Atuin — Boostez votre historique shell avec une base de données consultable et horodatée

Fatigué de perdre vos commandes dans le labyrinthe du CTRL+R par défaut ? Atuin remplace l'historique de votre shell par une TUI complète adossée à SQLite — horodatage, contexte, synchronisation multi-machines, et une comparaison claire avec la recherche d'historique basée sur FZF.

· 15 minutes de lecture
Voir la source
Christophe
Amoureux de Markdown, WSL et Docker ~ Curieux insatiable.
Claude Code
Assistant IA
Cet article existe aussi en anglais — lire la version originale.

Traduction automatique

Cette traduction a été produite par une IA. Elle peut contenir des contresens ou des maladresses, en particulier sur les termes techniques. En cas de doute, consultez l'article de référence en anglais — c'est lui qui fait foi.

Atuin — Boostez votre historique shell

⚡
TL;DR

L'historique shell par défaut est un cimetière de commandes que vous ne retrouverez jamais — pas d'horodatage, pas de contexte, 500 lignes et puis plus rien. Atuin le remplace par une TUI adossée à SQLite qui enregistre chaque commande avec son code de sortie, son répertoire de travail, sa durée et son horodatage. Vous obtenez un CTRL+R instantanément amélioré, avec filtrage par host ou par dossier, sans sacrifier votre historique existant. La seconde moitié de cet article détaille l'installation sur Bash et ZSH, et se termine par une comparaison en face à face avec l'approche classique FZF+history.

Zut, ça recommence. J'ai tapé CTRL+R, cherché cette longue commande docker run que j'avais construite il y a trois semaines, et rien — ou pire, la mauvaise version de mardi dernier. L'historique bash par défaut est juste... insuffisant. Cinq cents lignes, pas d'horodatage, aucun contexte sur le dossier où vous étiez ni même sur le succès de la commande.

J'ai déjà écrit sur les astuces d'historique intégrées — HISTSIZE, HISTTIMEFORMAT, fc, la recherche inversée — et ça aide, oui. Mais ce sont des contournements, pas une solution. Vous cherchez toujours dans un fichier texte plat sans aucune donnée structurée.

Atuin change complètement la donne.

Qu'est-ce qu'Atuin ?​

Atuin (le nom est un clin d'œil à la tortue-monde de Terry Pratchett) remplace l'historique de votre shell. Au lieu d'ajouter les commandes à ~/.bash_history, il écrit chaque commande dans une base SQLite locale avec des métadonnées riches :

  • Horodatage — quand l'avez-vous lancée ?
  • Durée — combien de temps a-t-elle pris ?
  • Code de sortie — a-t-elle réussi ?
  • Répertoire de travail — où étiez-vous ?
  • Nom d'host — sur quelle machine ?

Quand vous appuyez sur CTRL+R, au lieu du minuscule prompt de recherche inversée incrémentale, Atuin ouvre une TUI plein écran où vous pouvez taper, filtrer par host ou par répertoire, et naviguer aux flèches. Ça fonctionne sur Bash, ZSH, Fish et Nushell. Une synchronisation cloud chiffrée de bout en bout, optionnelle, permet de partager l'historique entre machines — mais c'est entièrement facultatif ; Atuin fonctionne parfaitement hors ligne et en local.

Aucun cloud requis

La synchronisation d'Atuin est optionnelle. Si vous ne lancez jamais atuin register ni atuin login, votre historique reste 100 % local dans ~/.local/share/atuin/history.db. Cet article ne traite que de l'expérience locale.

Le voir en action avec Docker​

Vous connaissez déjà Atuin, ou vous voulez juste l'avoir sur votre machine ? Passez directement à l'installation — ce chapitre n'est qu'un container jetable pour l'essayer sans risque.

Vous me connaissez bien maintenant — j'aime tout mettre en container. Avant d'installer quoi que ce soit sur votre machine, montons un container jetable pour que vous sentiez ce qu'Atuin donne en pratique.

Pourquoi Docker d'abord ?

Un container Docker vous permet de tester Atuin sans toucher à la configuration réelle de votre shell. Si ça ne vous plaît pas, vous supprimez le container. Aucun hook résiduel dans votre ~/.bashrc.

Deux fichiers dans un dossier — et tous les deux sont de l'échafaudage de démo, rien d'autre. seed-history.sh en particulier ne fait pas partie de l'usage d'Atuin : son seul rôle est de fabriquer un historique plausible pour que l'écran suivant ait quelque chose à montrer. Aucun de ces deux fichiers n'a sa place sur votre propre machine, où installer Atuin se résume à un brew install.

📦 Mise en place du projet : /tmp/atuin-demo
Aide

Besoin d'aide ? Cliquez sur le bouton « Aide » ci-dessus pour les instructions de mise en place.

>user@machine: ~/atuin-demo

$ docker build -t atuin-demo . [+] Building 28.3s (8/8) FINISHED ✔ exporting to image

$ docker run --rm -it atuin-demo Atuin history seeded with 51 commands. root@4f2a1b3c9d8e:/#

Ne tapez rien — appuyez tout de suite sur CTRL+R :

>user@machine: ~/yourproject

[atuin] > _ ────────────────────────────────────────────────────────────────────────── 1 [exit 0] 1s 12m ~/projects/blog docker compose up -d 2 [exit 0] 320ms 15m ~/projects/blog git status 3 [exit 1] 90ms 18m ~/projects/blog git push origin main 4 [exit 0] 140ms 21m ~/projects/blog git pull --rebase 5 [exit 0] 12s 26m ~/projects/blog yarn build 6 [exit 0] 760ms 34m ~/projects/blog yarn lint 7 [exit 0] 95ms 41m ~/projects/blog rg --type md "atuin" . 8 [exit 0] 210ms 47m ~/projects/blog fzf --preview 'bat --color=always ' 9 [exit 127] 30ms 55m ~/projects/blog yarnn start 10 [exit 0] 45ms 58m ~/projects/blog yarn start ────────────────────────────────────────────────────────────────────────── ↑/↓ navigate Enter select Ctrl+D delete Esc quit

Code de sortie, durée, horodatage et répertoire de travail — tout dans une seule vue. L'entrée 9 est typiquement ce que vous ne voyez qu'avec Atuin : une faute de frappe (yarnn) morte avec le code 127, juste à côté de la commande corrigée qui a suivi trois minutes plus tard.

Maintenant commencez à taper. Tapez git et la liste se réduit aux commandes git ; tapez docker et vous atteindrez des commandes lancées dans un autre répertoire de projet, et même sur une autre machine — les données de démo couvrent deux noms d'host et trois sessions shell, donc le filtre CTRL+F a vraiment de quoi travailler.

Cet historique ne sort pas de nulle part : seed-history.sh l'écrit directement dans la base SQLite d'Atuin avant le démarrage du shell — son commentaire d'en-tête explique pourquoi, si ça vous intéresse. Passons d'abord à la vraie installation.

Installer Atuin​

Si vous voulez garder Atuin en permanence sur votre machine (et ce sera le cas, après la démo), utilisez votre gestionnaire de packages. Atuin est dans tous les habituels, et c'est de loin la façon la moins excitante de l'obtenir — c'est exactement ce qu'on attend d'une installation.

Utilisez simplement Homebrew​

>user@machine: ~

$ brew install atuin

C'est tout. La formule atuin de Homebrew suit l'upstream de près — 18.22.0 au moment où j'écris, la même version que la dernière release GitHub — et elle fournit une bottle précompilée pour Linux comme pour macOS, donc c'est tout autant la bonne réponse dans WSL.

La formule elle-même est publique et relue via une pull request, le binaire vient d'une bottle construite par la CI de Homebrew, et brew upgrade atuin le maintiendra à jour ensuite — vous n'aurez pas besoin de revenir sur cette page pour ça.

Vous n'avez pas encore Homebrew ?

Installer Homebrew implique un curl redirigé dans bash — j'ai fait exactement ça dans un article précédent, et c'est la commande que brew.sh publie. Inutile de prétendre le contraire.

Une chose en fait un marché plus honnête que la plupart : le script vit dans le repository public Homebrew/install, vous pouvez donc épingler une révision que vous avez réellement lue plutôt que d'exécuter ce qui traîne sur la branch aujourd'hui.

SHA=8949852f785a3bacaba2a979d0790337950b0a4a
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/${SHA}/install.sh)"

Sur Apple Silicon vous pouvez éviter tout ça : Homebrew fournit un Homebrew.pkg signé.

Il n'y a pas de package apt

Atuin n'est pas dans les repositories Debian ou Ubuntu, donc ne cherchez pas apt install atuin. Si vous avez une toolchain Rust, cargo install atuin est une autre voie honnête : il construit depuis les sources publiées plutôt que de faire confiance à un binaire précompilé.

Sous Windows : winget​

Le lecteur habituel de ce blog tourne sous WSL, donc celui-ci mérite un mot à part. Atuin est dans le Windows Package Manager :

>PS C:\\Users\\christophe

PS> winget install -e --id Atuinsh.Atuin

Même forme de garantie qu'avec Homebrew : le manifeste vit dans le repository public microsoft/winget-pkgs, relu par pull request, et il épingle le SHA-256 de l'installeur — winget refuse donc tout ce qui ne correspond pas.

Windows et WSL, deux historiques distincts

winget installe atuin.exe, le build Windows — il vous donne Atuin dans PowerShell et CMD, pas dans votre shell WSL. Si vous vivez dans WSL, l'historique qui vous intéresse vraiment est celui enregistré par le binaire Linux, installé dans votre distribution, avec sa propre base sous ~/.local/share/atuin/. Installez les deux si vous voulez les deux ; ce sont deux installations et deux historiques sans rapport.

Sans gestionnaire de packages​

Télécharger le binaire de la release et le vérifier
Vos valeurs pour cette page
défaut
S'applique aux commandes de cette pageEnregistré uniquement sur cet appareil

Chaque release fournit un binaire simple. Prenez le build musl : il est lié statiquement et tourne partout, alors que le -gnu veut une glibc récente et meurt avec GLIBC_2.39 not found sur les distributions plus anciennes.

>user@machine: ~

$ V=18.22.0 $ BASE=https://github.com/atuinsh/atuin/releases/download/v$V $ curl -fsSLO $BASE/atuin-x86_64-unknown-linux-musl.tar.gz $ curl -fsSLO $BASE/atuin-x86_64-unknown-linux-musl.tar.gz.sha256 $ sha256sum -c atuin-x86_64-unknown-linux-musl.tar.gz.sha256 atuin-x86_64-unknown-linux-musl.tar.gz: OK

Ensuite, mettez-le dans votre PATH :

>user@machine: ~

$ tar -xzf atuin-x86_64-unknown-linux-musl.tar.gz $ sudo install -m 755 atuin-x86_64-unknown-linux-musl/atuin /usr/local/bin/atuin $ atuin --version atuin 18.22.0

Les releases d'Atuin embarquent aussi des attestations de build signées — une preuve cryptographique du workflow qui a construit le binaire, vérifiable avec gh attestation verify. Bon à savoir ; pas indispensable pour démarrer.

En dernier recours : le one-liner officiel​

La documentation d'Atuin met en avant un curl redirigé directement dans sh. Vous le croiserez partout, donc je ne vais pas prétendre qu'il n'existe pas — mais vous devrez aller le chercher, et lire ceci d'abord.

Ceci confie votre machine à qui contrôle ce domaine

curl … | sh télécharge un script et l'exécute immédiatement, avec vos propres droits, sans que vous en voyiez une seule ligne. Si setup.atuin.sh est compromis un jour — domaine détourné, identifiant fuité, entrée CDN empoisonnée — alors ce que l'attaquant y a laissé s'exécute sur votre machine dès que vous appuyez sur Entrée. Aucune signature à vérifier, aucune révision à épingler, aucun diff à lire, et aucune trace ensuite.

Les flags --proto '=https' --tlsv1.2 ne sont pas la garantie qu'ils semblent être : ils sécurisent le transport, et ne disent absolument rien du contenu qui arrive.

Utilisez brew install atuin plus haut, ou l'installation du binaire vérifié juste au-dessus. Ne recourez à celle-ci que sur une machine qui n'a ni l'un ni l'autre.

Je comprends le risque — montrez-moi la commande quand même
>user@machine: ~

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

Brancher Atuin dans votre shell​

Quelle que soit la route choisie, le binaire est sur votre machine mais votre shell ignore encore son existence — CTRL+R est inchangé pour l'instant. Le brancher tient en deux lignes, et ce sont justement les deux lignes qui valent la peine d'être comprises.

Bash​

Ajoutez ces deux lignes à la fin de votre ~/.bashrc :

~/.bashrc
source /path/to/bash-preexec.sh # skip if you're on Bash 4.4+
eval "$(atuin init bash)"

bash-preexec sur Bash moderne

bash-preexec est une petite bibliothèque de hooks qui donne à Bash le mécanisme precmd / preexec que ZSH possède nativement ; Atuin l'utilise pour intercepter une commande avant et après son exécution, ce qui lui permet d'enregistrer le code de sortie et la durée. Sur Bash 4.4+ (la plupart des distributions Linux récentes), c'est optionnel. Atuin retombe sur un hook plus simple. Si vous voulez le suivi complet du code de sortie et de la durée, gardez bash-preexec. Sur Ubuntu 24.04 (Bash 5.2), ça marche très bien sans — mais la démo Docker l'inclut pour une compatibilité maximale.

Puis rechargez votre shell :

>user@machine: ~

$ source ~/.bashrc

ZSH​

Si vous utilisez déjà ZSH (et vous devriez — voici comment le mettre en place), Atuin s'intègre encore plus proprement car ZSH a des hooks preexec/precmd natifs. Aucune dépendance supplémentaire.

Ajoutez à ~/.zshrc :

~/.zshrc
eval "$(atuin init zsh)"

Puis rechargez :

>user@machine: ~

$ source ~/.zshrc

Si vous suivez un workflow ZSH modulaire, placez la ligne eval dans son propre fichier — par ex. ~/.zsh/plugins/atuin.zsh — et sourcez-le depuis votre ~/.zshrc principal. Ça garde votre config propre et facile à activer/désactiver.

Importer votre historique existant​

Atuin importe votre ~/.bash_history ou ~/.zsh_history actuel au premier lancement. Vous pouvez aussi le déclencher manuellement :

>user@machine: ~

$ atuin import auto ✓ Importing history from /home/christophe/.bash_history Imported 4 823 commands

Vos anciennes commandes sont maintenant dans la base avec leurs horodatages d'origine (s'il y en avait). Vous ne perdez rien.

Configurer Atuin​

La configuration d'Atuin vit dans ~/.config/atuin/config.toml. Les valeurs par défaut sont raisonnables, mais quelques options valent le détour :

~/.config/atuin/config.toml
# How many results to show in the TUI
search_mode = "fuzzy" # or "prefix", "fulltext"

# Filter by current directory by default (toggle with CTRL+F in the TUI)
filter_mode = "global" # or "host", "session", "directory"

# Show the full command, not a truncated one
show_preview = true

# Inline TUI instead of full-screen overlay
style = "compact" # or "full" (default), "auto"

Redémarrez votre shell après édition pour appliquer les changements.

Atuin vs. l'historique FZF​

FZF est la référence absolue de la recherche floue dans le terminal — y compris pour l'historique shell via CTRL+R quand il est branché avec le fzf-history-widget. Alors, comment Atuin se compare-t-il ?

FonctionnalitéAtuinFZF + history
BackendBase SQLiteFichier texte plat
HorodatageToujours enregistréSeulement si HISTTIMEFORMAT est défini
Code de sortieOuiNon
DuréeOuiNon
Répertoire de travailOuiNon
Synchro multi-machinesOui (optionnelle, chiffrée E2E)Non
Recherche floueOui (intégrée)Oui (via FZF)
Filtrer par répertoireOui (CTRL+F dans la TUI)Non
Filtrer par hostOuiNon
Shells supportésBash, ZSH, Fish, NuBash, ZSH, Fish
DépendancesUn binaireBinaire FZF + plugin shell
Import de l'historique existantOuiN/A (lit déjà le même fichier)
ConfigurationFichier TOMLFlags en variables de shell
TUIPanneau plein écranEn ligne (ou plein avec --height=100%)

Aucun des deux n'est strictement meilleur — ça dépend de vos besoins :

  • Utilisez FZF si vous l'avez déjà branché dans votre workflow pour autre chose (recherche de fichiers, branches git, contextes kubectl…) et que vous n'avez besoin que d'une recherche inversée basique. L'intégration FZF de CTRL+R est légère et ne demande ni daemon ni base de données.
  • Utilisez Atuin si vous vous souciez du pourquoi une commande a tourné (code de sortie, durée, répertoire) et que vous voulez un historique qui survit aux migrations de machine et se corrèle entre hosts. Le modèle base de données rend la recherche d'Atuin structurellement plus riche.

Ils ne sont pas mutuellement exclusifs. Certains font tourner les deux : Atuin pour CTRL+R (recherche structurée et horodatée) et FZF pour tout le reste (navigation de fichiers, complétions floues). Combiner FZF avec ripgrep pour la recherche dans le code reste un cas d'usage différent auquel Atuin ne touche jamais.

Désactiver le CTRL+R d'Atuin pour garder celui de FZF

Si vous voulez qu'Atuin enregistre l'historique en silence tout en gardant le binding CTRL+R de FZF, ajoutez ceci à votre config :

~/.config/atuin/config.toml
[keys]
scroll_exits = false

Et dans votre shell, bindez manuellement CTRL+R sur fzf-history-widget après avoir sourcé Atuin. Atuin continuera de capturer et stocker les commandes ; il n'interceptera juste plus la touche.

Conclusion​

La recherche inversée CTRL+R par défaut a été conçue à une époque où 500 commandes paraissaient largement suffisantes. Ce n'est plus le cas — pas quand vous jonglez entre builds Docker, workflows git, sessions SSH sur une demi-douzaine d'hosts et fonctions shell qui ont pris une heure à mettre au point. Atuin donne à cet historique la structure qu'il mérite : une vraie base de données, de vrais horodatages, un vrai contexte.

La démo Docker est la meilleure façon de sentir la différence sans engagement. Lancez-la, appuyez sur CTRL+R, et trois semaines d'historique sont déjà là à vous attendre — vous verrez immédiatement pourquoi un fichier plat ne suffit pas. Si vous êtes déjà FZF user, ne voyez pas Atuin comme un remplaçant — voyez-le comme ce qui arrive quand on applique le principe « les données structurées battent le texte brut » à l'outil que vous utilisez plus que tous les autres.

Maintenant, chaque fois que je me trompe sur cette incantation tar parfaite ou que j'oublie dans quel répertoire j'étais quand ce script a enfin marché, Atuin s'en souviendra pour moi.


Cet article vous a-t-il été utile ?
Avez-vous suivi les étapes de cet article ?