用途
tmux 技能用于把 tmux 当作可编程的终端复用器,运行并交互长时间运行、有状态或交互式的命令行应用,例如 Python REPL、调试器(gdb/lldb)或常驻服务器。它通过向 tmux 会话发送按键并抓取窗格输出来实现远程控制。该技能在 Linux 和 macOS 上使用系统自带的 tmux 即可工作。
主要能力
- 创建、查看和清理隔离的 tmux 会话。
- 向指定会话/窗口/窗格发送字面量按键或控制键(如 C-c、C-d、C-z、Escape、Enter)。
- 抓取窗格最近的历史输出,用于观察交互结果。
- 通过轮询等待特定文本或提示符出现,避免与交互式工具产生竞态。
- 提供辅助脚本:find-sessions.sh(列出会话及元数据、可按关键词过滤)和 wait-for-text.sh(按正则或固定字符串轮询窗格,支持超时)。
使用方式
1. 设置与 socket 约定
始终使用专用 socket,使会话与用户个人 tmux 环境隔离。创建并使用 AGENT_TMUX_SOCKET_DIR(默认 ${TMPDIR:-/tmp}/agent-tmux-sockets)。默认 socket 路径:SOCKET="$AGENT_TMUX_SOCKET_DIR/agent.sock"。
标准设置片段:
SOCKET_DIR=${TMPDIR:-/tmp}/agent-tmux-sockets
mkdir -p "$SOCKET_DIR"
SOCKET="$SOCKET_DIR/agent.sock"
SESSION=agent-python # 使用描述性、类似 slug 的名称,不含空格
2. 会话管理
目标格式:{session}:{window}.{pane},省略时默认为 :0.0。名称保持简短(如 agent-py、agent-gdb)。
- 启动:
tmux -S "$SOCKET" new -d -s "$SESSION" -n shell - 查看:
tmux -S "$SOCKET" list-sessions、tmux -S "$SOCKET" list-panes -a - 清理:
tmux -S "$SOCKET" kill-session -t "$SESSION"
3. 用户可见性(关键)
启动会话后,必须立即告诉用户如何监控该会话,给出可复制粘贴的命令。
自行监控该会话:
tmux -S "$SOCKET" attach -t <session-name>
或一次性抓取输出:
tmux -S "$SOCKET" capture-pane -p -J -t <session-name>:0.0 -S -200
4. 安全发送输入
优先使用字面量发送,避免 shell 拆分:tmux -S "$SOCKET" send-keys -t "$SESSION" -l -- "$cmd"。
组合内联命令时,使用单引号或 ANSI C 引用避免展开:tmux -S "$SOCKET" send-keys -t "$SESSION" -- $'python3 -m http.server 8000'。
发送控制键:tmux -S "$SOCKET" send-keys -t target C-c, C-d, C-z, Escape, Enter。
5. 观察输出与同步
- 抓取最近历史:
tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION" -S -200 - 轮询提示符:使用定时轮询,避免与交互式工具产生竞态。例如在发送代码前等待 Python 提示符:
./scripts/wait-for-text.sh -S "$SOCKET" -t "$SESSION":0.0 -p '^>>>' -T 15 -l 4000
6. 交互式工具配方
Python REPL:
- 发送:
tmux -S "$SOCKET" send-keys -t "$SESSION" -- 'PYTHON_BASIC_REPL=1 python3 -q' Enter - 等待:wait-for-text.sh 等待 ^>>>
- 注意:PYTHON_BASIC_REPL=1 很关键,可防止控制台干扰 send-keys。
GDB/LLDB:
- 发送:
tmux -S "$SOCKET" send-keys -t "$SESSION" -- 'gdb --quiet ./a.out' Enter - 禁用分页:
tmux -S "$SOCKET" send-keys -t "$SESSION" -- 'set pagination off' Enter - 中断:发送 C-c
- 退出:发送 quit 然后 y。
- 注意:在 macOS 上调试默认使用 lldb。
7. 辅助脚本
./scripts 目录下提供辅助脚本:
- find-sessions.sh:列出会话及元数据。
- 扫描活动 socket:
./scripts/find-sessions.sh -S "$SOCKET" - 过滤:
./scripts/find-sessions.sh -S "$SOCKET" -q "python"
- 扫描活动 socket:
- wait-for-text.sh:按正则(或固定字符串)轮询窗格,支持超时。
./scripts/wait-for-text.sh -S "$SOCKET" -t session:0.0 -p 'pattern' [-F] [-T 20] [-i 0.5] [-l 2000]
8. 清理
- 结束特定会话:
tmux -S "$SOCKET" kill-session -t "$SESSION" - 完全清除:
tmux -S "$SOCKET" kill-server
适用场景
- 需要与 Python REPL、gdb/lldb 等交互式命令行程序进行自动化交互。
- 运行和观察长时间运行、有状态或常驻的服务器进程。
- 在隔离环境中管理多个交互式会话,避免影响用户个人 tmux 环境。
限制
- 资料未提供除 Linux 和 macOS 之外平台的支持情况。
- 资料未提供安装步骤、依赖版本要求或收费信息。
- 资料未提供辅助脚本的具体实现细节或更多参数说明。