tmux + Codex:把 AI 变成可恢复的终端工作流
如果你已经在 WSL + zsh + 终端编辑器里长期开发,那么把 Codex 放进 tmux,通常比“在当前窗口临时跑一下”更稳。
这篇文章只回答一个问题:为什么这组搭配值得长期保留,以及我如何把它做成低摩擦、可复用的日常入口。
核心结论
Codex 负责执行任务,tmux 负责托管会话。
两者组合后,你得到的不是一次性命令行体验,而是可断开、可恢复、可并行的 agent 工作流。
为什么它们天然互补
单独使用 Codex 已经能完成很多任务,但当任务变长时,运行容器本身会成为瓶颈。tmux 正好补齐这部分。
最直接的收益有 4 个:
- 会话可恢复:断网、断开 SSH、关掉窗口后都能回来继续
- 会话可并行:同机可开多个 agent,不互相抢上下文
- 项目可隔离:每个仓库可以有独立 session
- 人机可解耦:agent 在后台跑,你可以先处理别的事
先把 session 操作压短
要让工作流长期可用,优先做的不是“复杂美化”,而是把高频操作压成稳定入口。
我当前使用的 zsh 函数如下:
zsh
_ta() {
[[ -n "$TMUX" ]] && tmux switch-client -t "$1" || tmux attach -t "$1"
}
_tspick() {
command -v tmux >/dev/null 2>&1 || return 1
tmux list-sessions -F '#S' 2>/dev/null | fzf
}
tnew() {
[[ -n "$1" ]] || { echo "usage: tnew <session>"; return 1; }
command -v tmux >/dev/null 2>&1 || { echo "tmux not found"; return 1; }
tmux has-session -t "$1" 2>/dev/null || tmux new-session -ds "$1"
_ta "$1"
}
ts() {
local s
s="$(_tspick)" || return
[[ -n "$s" ]] && _ta "$s"
}
tk() {
local s
s="$(_tspick)" || return
[[ -n "$s" ]] && tmux kill-session -t "$s"
}这一组函数的目标很明确:少记命令、快切换、低出错。
codexx():把目录上下文绑定到 agent
真正把 tmux 与 Codex 串起来的是这个函数:
zsh
codexx() {
local session cmd
command -v tmux >/dev/null 2>&1 || { echo "tmux not found"; return 1; }
session="codex-${${PWD:A}//[^[:alnum:]_.-]/_}"
cmd='zsh -ic "source ~/.zshrc; exec codex --yolo"'
if [[ -n "$TMUX" ]]; then
tmux has-session -t "$session" 2>/dev/null || tmux new-session -d -s "$session" "$cmd"
tmux switch-client -t "$session"
return
fi
tmux new-session -A -s "$session" "$cmd"
}它的关键点不是“自动执行命令”,而是“目录即上下文”:
- session 名由当前目录稳定生成
- 目录一致时总能回到同一条 agent 上下文
- 在
tmux内外都能复用同一个入口
这能显著减少“我现在到底在哪个项目上下文里”的认知负担。
相比直接开终端跑,有什么本质差异
直接在当前终端启动 Codex 当然可行,但会把会话生命周期绑定到窗口生命周期。
一旦出现以下场景,差异会非常明显:
- 网络波动导致连接中断
- 临时切换到另一个项目排障
- 需要让 agent 持续跑命令,你先离开
- 需要保留完整输出,稍后回看
tmux 的价值就是把这些“环境波动”从任务执行里剥离出去。
我现在的固定节奏
我日常基本按这个顺序执行:
- 进入项目目录
- 执行
codexx - 复用或自动拉起当前目录对应 session
- 需要时开新 pane 跑测试、看日志、改代码
- 离开时
detach,回来继续
这个节奏简单,但稳定。窗口会变、网络会变,工作流本身不变。
收束
如果你把 AI agent 当作长期协作者,而不是一次性命令,tmux 往往不是“可选增强”,而是底层设施。
Codex 提供执行能力,tmux 提供生命周期管理。两者叠加后,终端里的 AI 协作才会真正进入可持续状态。