怎么用 Atuin 18.24 同步 Linux Shell 历史(2026)

如果你曾经 SSH 到三台机器上,想不起来自己到底在哪台上跑过那条 kubectl rollout,那你已经懂了 Atuin 的存在意义。它把你的纯文本 ~/.bash_history 替换成结构化的 SQLite 数据库,记录每条命令的工作目录、退出码、耗时、主机名和时间戳,然后用一个模糊搜索的全文本界面让你搜遍所有这些。再叠上 Atuin 自带的可选同步服务器,同样的可搜索历史就会出现在你登录的每一台机器上,端到端加密,服务器管理员也读不到你的命令。

Atuin 18.24.1 在 2026-10-13 打了 tag,延续了这个项目一个月两次的稳定节奏 —— 主要是 bug 修复、偶尔新增搜索操作符,以及对桌面端同步服务器的持续打磨。在 Linux 终端工具里,它属于那种用一个下午就会常驻进 ~/.zshrc 的稀有工具。

你真正得到的

  • 结构化历史。 普通的 history 给的是一个扁平列表。atuin search 给你的是 所有东西 —— 退出码、耗时秒数、运行主机、工作目录、时间。你可以用自然语言时间戳 ("last friday"、"yesterday 3pm") 做 --before / --after 过滤,可以按 --exit 0、--exit !=0、--cwd 任意组合筛选。
  • 加密同步。 启用后,Atuin 的客户端守护进程会跟一台 Atuin 服务器通信,用只由你掌握的 passphrase 派生出 session token。载荷在客户端加密,服务器只存密文。可以用官方托管的 atuin.sh,也可以用自带的 Docker compose 自托管,或者干脆不开同步、本地保留。
  • 统计与洞察。 atuin stats 一行命令回答”我到底在 shell 里干了什么”。在大部分开发者的机器上,前三名一般是某种 git、docker 和编辑器 —— 偶尔有用、偶尔扎心。
  • 无缝替换。 Atuin 给 zsh 的 zle 注册了 atuin widget,给 bash 通过 bind '"C-r":"C-xC-a"' 绑定了 readline 快捷键,fish 也有等价物。默认绑定是 Ctrl-R,正是大多数 shell 反向搜索已经在用的键 —— Atuin 只是把下面的 UI 升级了。

Atuin 全文本搜索界面,显示带退出码、耗时、时间戳和命令预览的 Shell 历史

图:Atuin 的交互式搜索提示框。每一行都展示退出码、耗时、工作目录和主机 —— 这些上下文都是普通 history 直接丢掉的。

在 Linux 上安装

Atuin 给 x86_64-unknown-linux-musl 和 aarch64-unknown-linux-musl 提供了预构建二进制,以及给老 glibc 系统准备了 x86_64-unknown-linux-gnu 静态构建。官方安装器在每个发行版上都是最快的路:

Bash
curl --proto '=https' --tlsv1.2 -sSf https://setup.atuin.sh | bash

这个脚本会检测你的 shell,把二进制放到 ~/.local/bin/atuin(用 sudo 的话会放到 /usr/local/bin),然后打印需要加到 rc 文件的几行。重启 shell 或者 source 一下,atuin --version 应该输出 18.24.x。

如果你不想用 curl | sh,GitHub release 页上也有 .deb 和 .rpm 包,Arch 的 atuin 包一般一两天内就会跟上。

Homebrew / Nix

  • Linux 上的 Homebrew: brew install atuin
  • Nix: nix-env -iA nixpkgs.atuin 或在系统包里加 pkgs.atuin。
  • Cargo(从源码编译): cargo install atuin --locked —— 需要 Rust 1.74+。

官方 Atuin 安装脚本与首次搜索命令的样式化模拟

图:官方安装脚本的输出与首次 atuin search 调用的样式化模拟。写作时未能从 SPA 渲染的项目站拿到真实截图。

接入你的 shell

装好之后,Atuin 每个 shell 需要一行。安装器会自动打印正确的版本,核心就是:

bash —— 加到 ~/.bashrc:

Bash
eval "$(atuin init bash)"

zsh —— 加到 ~/.zshrc:

Zsh
eval "$(atuin init zsh)"

fish —— 加到 ~/.config/fish/config.fish:

Fish
atuin init fish | source

重启 shell(或 source rc 文件),按 Ctrl-R,Atuin 就接管了反向搜索。旧的 ~/.bash_history 第一次启动会自动导入,之后想重新导入可以跑 atuin import auto(会自动嗅探 bash、zsh、fish 和 nu 的历史文件)。

如果你想保留两套 —— 同时有 Atuin 和原本的历史搜索 —— 换个绑定:

Bash
bind '"C-\":"C-xC-a"'   # bash 里是 Ctrl-

zsh 里:

Zsh
bindkey '^\' atuin-search

像高手一样搜

真正的杀手锏是过滤 DSL。在任意 shell 里:

Bash
# 昨天下午 3 点之后跑的、退出码 0、包含 make 的命令
atuin search --exit 0 --after "yesterday 3pm" make

# 当前主机上跑过的所有 cargo build,不限时间
atuin search --host "$(hostname)" "cargo build"

# 周日跑失败的命令 —— 用来做每周复盘
atuin search --before "mon" --after "sun" --exit "!0"

在交互界面里你可以:

  • 再按一次 Ctrl-R 在过滤模式之间循环(全局、主机、会话、目录)。
  • Tab / 方向键 选中一条,直接执行在当前 shell。
  • Enter 先编辑这条命令再执行。
  • Ctrl-C 中止,不动 prompt。

Atuin 交互式搜索提示框,模糊匹配过滤此前的 kubectl 命令

图:按 Ctrl-R,敲几个字符,Atuin 按最近性、频次和模糊相似度给结果排序 —— 不只是子串相等。

可选:加密同步

同步功能是最容易被新手忽略的部分。Atuin 可以把加密过的历史同步到 任何 兼容 Atuin 协议的服务器 —— 官方托管的 https://api.atuin.sh、你自己跑的自托管实例、或者朋友的服务器。流程是:

  1. 注册账号: atuin register -u <username> -e <email>。CLI 在本地生成 session token,只发送它的哈希。
  2. 设置 passphrase: 同一个提示里会问。这个 passphrase 用 Argon2id 派生密钥加密你的历史,服务器永远看不到明文。
  3. 在每台机器上登录: atuin login -u <username>。同一个 passphrase、同一个加密密钥、历史全量同步。
  4. 验证: 任意一边跑 atuin sync 都应该显示绿色对勾,之后新命令默认 ~30 秒同步一次。

自托管的文档在 docs.atuin.sh/guides/self-host。最小化的栈就是一个 docker-compose.yml,一个 atuin/atuin 容器、一个 Postgres 数据库、再加一个反向代理上 TLS。

2026 年注意: 官方托管服务器在大版本发布那几周偶尔会有容量紧张。如果同步是刚需,自托管 —— 5 分钟就能搞定。

统计、看板,以及那些小确幸

atuin stats 是那种会让你要么自我感觉良好、要么被现实刺痛的一行命令:

Bash
$ atuin stats
  ★ 12,481 commands recorded
  ★ most-used:  git (1,841)  · cargo (1,022) · ssh (612) · kubectl (498) · docker (471)
  ★ unique directories: 207
  ★ unique hosts: 9
  ★ avg command/day: 142

想要图表就把它导进 blessed-contrib 这类 TUI,或者简单点,在 cron 里写一行 atuin stats > ~/weekly-$(date +%V).txt。

Atuin 统计面板,汇总最常用命令、独立目录数和历史总条数

图:atuin stats 是单一二进制对你 shell 习惯的全部洞察。除非你主动开同步,没有任何遥测会离开本机。

注意事项与已知怪癖

几个容易咬到新人的坑:

  • 带位置参数的 alias 导入时不一定干净。加新 alias 后再跑一次 atuin import bash。
  • 多行命令(比如在 vim 里 :r !command 那种)在历史里存成一条,但 TUI 里的多行展示靠终端换行 —— st 和 kitty 处理得很好,老版本 xterm 有时会糊掉。
  • 服务端全文本搜索 是加密-解密之后才做的,所以服务器只能做精确 token 查找。所有模糊 / --after 过滤仍然是客户端处理 —— 这是正确的权衡,但意味着特别大的历史(5 万条+)首次拉取会比较慢。
  • fish + Atuin + oh-my-fish 有个老问题:在 config.fish 里 先 加载 oh-my-fish 再 atuin init fish | source,否则 prompt 会被覆盖坏。

什么时候 不要 用 Atuin

不是所有人都适合。下列情况请绕开:

  • 严格策略不允许出站网络调用的 离线环境 —— 同步默认 opt-in,但首次启动默认配置会 ping 一下服务器。
  • 需要合规用的 可读审计日志 —— Atuin 的本地 SQLite 对你来说是神器,对想 grep 你历史的运维来说是噩梦。
  • 你在 只读文件系统 上,比如 kiosk 或容器 —— SQLite 存储需要 ~/.local/share/atuin 可写。

其他场景 —— 桌面 Linux、开发 VM、远程 SSH 目标 —— Atuin 是那种装一次、再也不用想,但某天突然需要找六周前那条命令、0.4 秒就搜出来了的工具。

收尾

Atuin 在 GitHub 上 MIT 协议开源,~24k star,维护节奏健康。18.x 这条线已经稳了一年多,changelog 是那种”修了过滤器的某个边界 case、同步守护进程吞吐又提了一截”的味道,信号是项目处于维护期而不是危机期。这恰恰是你给天天打交道的工具想看到的。

装好它、绑 Ctrl-R,下次想不起来上周四那条 kubectl rollout restart 到底怎么写的,它就跳出来了。

最后修改: 2026年10月19日

作者

评论

发表评论

您的邮箱地址不会被公开。