
在用了十几年命令行之后,我越来越觉得 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 your@email.com
注册后,登录并同步:
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 属于那种”用了就不想回头”的类型,如果你还没有试过,可以花几分钟装上体验一下,说不定会改变你对命令行历史的看法。