Atuin Shell 历史同步工具界面

在用了十几年命令行之后,我越来越觉得 Shell 历史是个被严重低估的功能。每次换机器、重装系统,那些积累了多年的命令历史就这么消失了。更让人抓狂的是,明明记得自己用过某个复杂的 ffmpeg 转码命令,或者某个 kubectl 调试命令,但就是死活想不起来完整参数。

直到发现了 [[Atuin]],这个问题才算真正解决。

Atuin 是什么

[[Atuin]] 是一个开源的 Shell 历史增强工具,GitHub 上已经获得了接近三万颗星。它最核心的思路是:把传统的纯文本 ~/.bash_history 替换成一个 SQLite 数据库,在存储命令的同时,记录下更多有价值的上下文信息。

原来的 Shell 历史只记录”你输入了什么”,而 Atuin 还会记录”你在哪个目录输入的”、”命令运行了多久”、”命令是否成功退出”、”是在哪台机器上输入的”。这些信息听起来不起眼,但当你真正需要找回某条命令时,这些上下文就是救命稻草——特别是你记得”这个命令我是在项目目录下运行的,而且大概跑了一分多钟”,就能快速缩小搜索范围。

更重要的是,Atuin 支持将历史加密同步到多台设备,所有数据在本地加密后才上传,即使使用官方提供的免费同步服务器,服务端也无法看到你的命令内容。如果不放心,也可以自己搭建服务器。

核心功能

Atuin 的功能设计相当克制,没有塞入太多花哨的东西,但每一个功能都切中要害。

搜索界面是最直接的改变。按下 Ctrl+R 或者上箭头,会弹出一个全屏的搜索界面,支持模糊搜索,可以按工作目录、主机名、会话等维度过滤。找到目标命令后,按 Enter 直接执行,或者按 Tab 只填入命令行不执行。

统计功能可以告诉你哪些命令用得最多,类似 atuin stats 可以生成一份使用分析报告。如果你是那种喜欢研究自己工作习惯的人,这个功能会让你花很多时间盯着屏幕看。

跨设备同步是 Atuin 最吸引人的功能之一。工作电脑、家用 Mac、远程服务器,所有历史都可以同步汇聚在一起。在家里的机器上能直接搜到上午在公司服务器上运行过的命令,这种体验真的很爽。

多 Shell 支持方面,Atuin 覆盖了主流 Shell,包括 Zsh、Bash、Fish、Nushell、Xonsh 和 PowerShell。不管你用哪个 Shell,都能无缝接入。

安装与配置

安装 Atuin 非常简单,官方提供了一键安装脚本:

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

如果不想直接跑脚本,也可以通过各种包管理器安装:

# macOS
brew install atuin

# Arch Linux
pacman -S atuin

# Cargo(Rust 工具链)
cargo install atuin

安装完二进制文件之后,需要给自己的 Shell 添加初始化配置。

Zsh 用户把这行加入 ~/.zshrc

eval "$(atuin init zsh)"

Bash 用户需要先安装 bash-preexec,然后:

eval "$(atuin init bash)"

Fish 用户在 ~/.config/fish/config.fish 中添加:

atuin init fish | source

配置完成后,执行 atuin import auto 导入现有的 Shell 历史,这样历史不会断档。

注册账号与同步

如果想使用云同步功能,需要注册一个账号。可以使用官方服务器,免费的:

atuin register -u your_username -e [email protected]

注册后,登录并同步:

atuin login -u your_username
atuin sync

如果嫌每次手动同步麻烦,可以设置自动同步。在配置文件 ~/.config/atuin/config.toml 中添加:

[sync]
records = true

[daemon]
enabled = true
sync_frequency = 300

这样 Atuin 会在后台每五分钟自动同步一次。

日常使用技巧

掌握了几个快捷键,Atuin 的使用效率会大幅提升。

在搜索界面中,Ctrl+D 可以切换搜索范围,在”全局历史”和”当前目录历史”之间切换。很多时候你需要找的命令就是在特定项目目录下运行的,切换到目录过滤模式可以大幅减少干扰。

Alt+数字 可以快速跳转到搜索结果的第几项,适合在少数几个候选命令间快速切换。

atuin search 命令也可以在命令行直接使用,支持通过 --cwd 参数按目录过滤,--exit 参数按退出状态过滤(比如只看成功执行的命令):

# 只搜索在当前目录运行过的命令
atuin search --cwd .

# 只搜索失败的命令(用来复盘报错)
atuin search --exit 1

# 搜索特定关键词
atuin search kubectl

统计命令可以帮你了解自己的命令行使用习惯:

atuin stats

自建同步服务器

对数据隐私有更高要求的话,可以自己搭建 Atuin 服务器。官方提供了完整的自托管方案,支持 Docker 和 [[Kubernetes]] 部署。

使用 Docker Compose 是最简单的方式:

services:
  atuin:
    image: ghcr.io/atuinsh/atuin:latest
    command: server start
    ports:
      - "8888:8888"
    environment:
      ATUIN_HOST: "0.0.0.0"
      ATUIN_OPEN_REGISTRATION: "true"
      ATUIN_DB_URI: "postgres://atuin:password@postgres:5432/atuin"
    depends_on:
      - postgres

  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: atuin
      POSTGRES_PASSWORD: password
      POSTGRES_DB: atuin
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

搭好服务器之后,在客户端配置文件中指定自定义服务器地址:

sync_address = "https://atuin.your-domain.com"

然后重新注册或者登录,之后的同步都走自己的服务器。

最后

用 Atuin 替换默认 Shell 历史之后,我最大的感受是”数据终于有了价值”。以前的命令历史像是一堆散乱的纸片,而现在变成了一个可以检索、有上下文的知识库。

尤其是跨设备同步这个功能,对于同时使用多台机器工作的人来说,价值不可估量。不再需要在不同机器间手动同步 ~/.bash_history,也不用担心某台机器的历史突然消失。

工具好不好,往往要用过才知道。Atuin 属于那种”用了就不想回头”的类型,如果你还没有试过,可以花几分钟装上体验一下,说不定会改变你对命令行历史的看法。