name: tmuxdescription: “Expert tmux session, window, and pane management for terminal multiplexing, persistent remote workflows, and shell scripting automation.”category: developmentrisk: safesource: communitydate_added: “2026-03-28”author: kostakost2tags: [tmux, terminal, multiplexer, sessions, shell, remote, automation]tools: [claude, cursor, gemini]tmux — 终端多路复用器概述tmux让终端会话在 SSH 断开后依然保持存活将工作拆分到多个窗格并支持完全可脚本化的终端自动化。本技能涵盖会话管理、窗口/窗格布局、按键绑定模式以及如何在 shell 脚本中以非交互方式使用tmux——这些对于远程服务器、长时间运行的任务和自动化工作流至关重要。何时使用本技能在远程服务器上设置或管理持久终端会话时使用当用户需要运行能够承受 SSH 断开的长时间运行进程时使用当编写多窗格终端布局脚本时使用例如日志 shell 编辑器当需要从 bash 脚本中无需用户交互地自动化tmux命令时使用工作原理tmux有三个层级会话最顶层可在断开后存活、窗口会话内的标签页和窗格窗口内的拆分区域。一切都可以从外部通过tmux command控制或从内部通过前缀键默认为Ctrl-b控制。会话管理# 创建一个新的命名会话tmux new-session-swork# 创建分离后台会话tmux new-session-d-swork# 创建分离会话并启动一个命令tmux new-session-d-sbuild-x220-y50make all# 附加到会话tmux attach-twork tmux attach# 附加到最近的会话# 列出所有会话tmux list-sessions tmuxls# 在 tmux 内部分离# 前缀 d (Ctrl-b d)# 终止一个会话tmux kill-session-twork# 终止除当前会话外的所有会话tmux kill-session-a# 从外部重命名会话tmux rename-session-told-name new-name# 从外部切换到另一个会话tmux switch-client-tother-session# 检查会话是否存在在脚本中有用tmux has-session-twork2/dev/nullechoexists窗口管理# 在当前会话中创建新窗口tmux new-window-twork-nlogs# 创建运行特定命令的窗口tmux new-window-twork:3-nserverpython -m http.server 8080# 列出窗口tmux list-windows-twork# 选择切换到一个窗口tmux select-window-twork:logs tmux select-window-twork:2# 按索引# 重命名窗口tmux rename-window-twork:2editor# 终止一个窗口tmux kill-window-twork:logs# 将窗口移动到新索引tmux move-window-swork:3-twork:1# 在 tmux 内部# 前缀 c — 新建窗口# 前缀 , — 重命名窗口# 前缀 — 终止窗口# 前缀 n/p — 下一个/上一个窗口# 前缀 0-9 — 按编号切换到窗口窗格管理# 垂直拆分窗格左/右tmux split-window-h-twork:1# 水平拆分窗格上/下tmux split-window-v-twork:1# 拆分并运行一个命令tmux split-window-h-twork:1tail -f /var/log/syslog# 按索引选择一个窗格tmux select-pane-twork:1.0# 调整窗格大小tmux resize-pane-twork:1.0-R20# 向右扩展 20 列tmux resize-pane-twork:1.0-D10# 向下缩小 10 行tmux resize-pane-Z# 切换缩放全屏# 交换窗格tmux swap-pane-swork:1.0-twork:1.1# 终止一个窗格tmux kill-pane-twork:1.1# 在 tmux 内部# 前缀 % — 垂直拆分# 前缀 — 水平拆分# 前缀 方向键 — 在窗格之间导航# 前缀 z — 缩放/取消缩放当前窗格# 前缀 x — 终止窗格# 前缀 {/} — 与上一个/下一个窗格交换无需附加即可向窗格发送命令# 向特定窗格发送命令并按下回车tmux send-keys-twork:1.0ls -laEnter# 在后台窗格中运行命令而不附加tmux send-keys-twork:editorvim src/main.pyEnter# 发送 CtrlC 停止正在运行的进程tmux send-keys-twork:1.0 C-c# 发送文本而不按回车用于预填充提示符tmux send-keys-twork:1.0git commit -m # 清空一个窗格tmux send-keys-twork:1.0clearEnter# 检查窗格中的内容捕获其输出tmux capture-pane-twork:1.0-ptmux capture-pane-twork:1.0-p|grepERROR编写完整工作区布局脚本这是最强大的模式从单个脚本创建完全配置的多窗格工作区。#!/usr/bin/env bashset-euopipefailSESSIONdev# 如果会话已存在则退出tmux has-session-t$SESSION2/dev/null{echoSession$SESSIONalready exists. Attaching...tmux attach-t$SESSIONexit0}# 创建带第一个窗口的会话tmux new-session-d-s$SESSION-neditor-x220-y50# 窗口 1编辑器 测试运行器并排tmux send-keys-t$SESSION:editorvim .Enter tmux split-window-h-t$SESSION:editortmux send-keys-t$SESSION:editor.1npm test -- --watchEnter tmux select-pane-t$SESSION:editor.0# 窗口 2服务器日志tmux new-window-t$SESSION-nservertmux send-keys-t$SESSION:serverdocker compose upEnter tmux split-window-v-t$SESSION:servertmux send-keys-t$SESSION:server.1tail -f logs/app.logEnter# 窗口 3通用 shelltmux new-window-t$SESSION-nshell# 聚焦第一个窗口tmux select-window-t$SESSION:editor# 附加tmux attach-t$SESSION配置~/.tmux.conf# 将前缀改为 Ctrl-ascreen 风格unbind C-bset-gprefix C-abindC-a send-prefix# 启用鼠标支持set-gmouse on# 窗口/窗格编号从 1 开始set-gbase-index1setw-gpane-base-index1# 关闭一个窗口时重新编号set-grenumber-windows on# 增加回滚缓冲区set-ghistory-limit50000# 在复制模式中使用 vi 键位setw-gmode-keysvi# 更快的按键重复set-sescape-time0# 无需重启即可重新加载配置bindr source-file ~/.tmux.conf\;displayConfig reloaded# 直观的拆分| 和 -bind|split-window-h-c#{pane_current_path}bind- split-window-v-c#{pane_current_path}# 新窗口在当前目录打开bindc new-window-c#{pane_current_path}# 状态栏set-gstatus-right#{session_name} | %H:%M %d-%bset-gstatus-interval5复制模式与回滚# 进入复制模式向上滚动查看输出# 前缀 [# 在 vi 模式下# / 向前搜索? 向后搜索# 空格开始选择回车复制# q 退出复制模式# 粘贴最近的缓冲区# 前缀 ]# 列出粘贴缓冲区tmux list-buffers# 显示最近的缓冲区tmux show-buffer# 将缓冲区保存到文件tmux save-buffer /tmp/tmux-output.txt# 将文件加载到缓冲区tmux load-buffer /tmp/data.txt# 将窗格输出通过管道传给命令tmux pipe-pane-twork:1.0cat ~/session.log实用自动化模式# 幂等会话创建或附加ensure_session(){localname$1tmux has-session-t$name2/dev/null\||tmux new-session-d-s$nametmux attach-t$name}# 在新后台窗口中运行命令并跟踪其输出run_bg(){localsession${1:-main}cmd${*:2}tmux new-window-t$session-nbg-$$tmux send-keys-t$session:bg-$$$cmdEnter}# 等待窗格产生特定输出轮询wait_for_output(){localtarget$1pattern$2timeout${3:-30}localelapsed0while((elapsedtimeout));dotmux capture-pane-t$target-p|grep-q$patternreturn0sleep1((elapsed))donereturn1}# 终止所有匹配名称前缀的后台窗口kill_bg_windows(){localsession$1prefix${2:-bg-}tmux list-windows-t$session-F#W\|grep^${prefix}\|whileread-rwin;dotmux kill-window-t${session}:${win}done}远程与 SSH 工作流# SSH 并立即附加到现有会话sshuserhost-ttmux attach -t work || tmux new-session -s work# 在远程主机上于 tmux 会话内运行命令发出后即忘sshuserhosttmux new-session -d -s deploy bash /opt/deploy.sh# 从另一个终端观看远程会话输出sshuserhost-ttmux attach -t deploy -r# 只读附加# 结对编程共享会话两个用户附加到同一会话# 用户 1tmux new-session-sshared# 用户 2同一服务器tmux attach-tshared最佳实践在脚本中始终为会话命名-s name——未命名的会话难以可靠定位在创建前使用tmux has-session -t name 2/dev/null使脚本幂等创建分离会话时设置-x和-y为会检查终端尺寸的命令提供合适的窗格大小自动化时使用send-keys ... Enter而不是通过管道输入 stdin——即使目标窗格正在运行交互式程序它也能正常工作将~/.tmux.conf纳入版本控制以便在不同机器上实现可复现性对于不需要前缀的绑定优先使用bind -n但只用于不会与应用程序快捷键冲突的按键安全与注意事项send-keys会在窗格中不加确认地执行命令——在脚本中使用前请核实目标-t session:window.pane避免将按键发送到错误的窗格与他人共享会话时使用只读附加-r是合适的可防止意外输入避免在共享机器的 tmux 窗口/窗格标题或导出到会话的环境变量中存储机密常见陷阱问题脚本中的tmux命令失败并提示no server running没有正在运行的服务器解决方案先用tmux start-server启动服务器或在运行其他命令之前创建一个分离会话。问题创建分离会话时窗格大小为 0x0解决方案传递显式尺寸tmux new-session -d -s name -x 200 -y 50。问题send-keys输入了文本但没有运行命令解决方案确保传递Enter大写 E作为第二个参数tmux send-keys -t target cmd Enter。问题脚本每次运行都会创建重复会话解决方案使用tmux has-session -t name 2/dev/null || tmux new-session -d -s name进行保护。问题复制模式选择不符合预期解决方案确认在~/.tmux.conf中设置了符合你偏好的mode-keys vi或mode-keys emacs。相关技能bash-pro— 编写编排 tmux 会话的 shell 脚本bash-linux— 在 tmux 窗格内使用的通用 Linux 终端模式ssh— 将 tmux 与 SSH 结合用于持久远程工作流局限性仅当任务与上述范围明确匹配时使用本技能。不要将输出视为环境特定验证、测试或专家审查的替代品。如果缺少必需的输入、权限、安全边界或成功标准请停下来请求澄清。