Skip to content

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 的价值就是把这些“环境波动”从任务执行里剥离出去。

我现在的固定节奏 ​

我日常基本按这个顺序执行:

  1. 进入项目目录
  2. 执行 codexx
  3. 复用或自动拉起当前目录对应 session
  4. 需要时开新 pane 跑测试、看日志、改代码
  5. 离开时 detach,回来继续

这个节奏简单,但稳定。窗口会变、网络会变,工作流本身不变。

收束 ​

如果你把 AI agent 当作长期协作者,而不是一次性命令,tmux 往往不是“可选增强”,而是底层设施。

Codex 提供执行能力,tmux 提供生命周期管理。两者叠加后,终端里的 AI 协作才会真正进入可持续状态。

Nine and AI — Licensed under the MIT License