用途:该技能面向编程智能体,说明如何从命令行非交互地使用 tmux(终端复用器),让程序在窗格中存活于终端关闭之后,并可被检查、驱动和重新连接。
适用情形:需要进程超出智能体单轮或终端生命周期(长时间构建、服务器、监视任务);需要交互性(REPL、提示输入的程序、vim/htop/fzf 等 TUI);需要真实 TTY 或固定窗口尺寸;需要边运行边查看实时输出。若普通重定向(cmd > out.log 2>&1)已够用,则不必使用 tmux。
心智模型:服务器(每个 socket 一个)→ 会话($0、$1)→ 窗口(@0、@1)→ 窗格(%0,每个含一个终端与运行中的程序)。脚本中建议用唯一 ID($3、@2、%5)而非名称或索引。智能体自用会话建议使用独立 socket:tmux -L pi-agent ...。
核心流程:以固定尺寸创建分离会话(tmux -L pi-agent new-session -d -s build -x 220 -y 50),用 send-keys 发送命令并追加哨兵(send-keys -t build 'make 2>&1; echo "DONE:$?"' Enter),轮询 capture-pane 输出中展开后的哨兵(DONE:[0-9]),读取结果(capture-pane -p -S -2000),最后清理(kill-session)。
主要能力:会话/窗口/窗格管理(new-session、split-window、select-pane、rename-window、respawn-pane、set-option、set-hook、run-shell);输入注入(send-keys,Enter 为键名而非 \n,-l 字面文本,-H 十六进制,C-c 中断);输出读取(capture-pane,-S 读取回滚缓冲,-J 合并软换行,-a 备用屏,-e 保留颜色);检视 API(list-panes -F、display-message -p 配合格式变量,如 #{pane_id}、#{pane_dead}、#{pane_pid}、#{pane_current_command})。完成检测方式包括哨兵回显、remain-on-exit 配合 #{pane_dead}、进程检查与 wait-for。
限制与注意事项:未指定尺寸的分离窗格默认为 80x24;send-keys 立即返回,不等待程序响应;不要脚本化 C-b 前缀;默认 socket 与用户共享,可能干扰其会话;wait-for 存在竞态;capture-pane 默认只取可见屏,引号复杂时建议写临时脚本文件发送。
参考:官方 tmux 维基与 man 1 tmux。