tmux 快捷鍵速查:視窗、分屏、會話與滾動操作

整理 tmux 的 Ctrl+b 前綴鍵、視窗和面板操作、會話退出與恢復、歷史輸出滾動方法,並補充常用命令、設定和排錯步驟。

tmux 可以在一個終端中管理多個視窗和分屏,還能在 SSH 斷開後繼續保持任務執行。 它的預設前綴鍵是 Ctrl+b。大多數快捷鍵都要分兩步按:

  1. 按下 Ctrl+b
  2. 鬆開兩個鍵;
  3. 再按動作鍵。 例如,新建視窗不是同時按 Ctrl+b+c,而是先按 Ctrl+b,鬆開後再按 c

最需要記住的快捷鍵

1
2
3
4
5
6
Ctrl+b d       退出 tmux,但讓任務繼續執行
Ctrl+b %       左右分屏
Ctrl+b "       上下分屏
Ctrl+b 方向鍵  切換面板
Ctrl+b z       當前面板全屏或恢復
Ctrl+b [       檢視和滾動歷史輸出

恢復剛才退出的會話:

1
tmux attach

安裝並確認 tmux 可用

Debian、Ubuntu:

1
2
sudo apt update
sudo apt install tmux

Fedora:

1
sudo dnf install tmux

Arch Linux:

1
sudo pacman -S tmux

macOS 使用 Homebrew:

1
brew install tmux

安裝後檢視版本:

1
tmux -V

終端返回類似 tmux 3.x 的資訊,說明命令已經進入當前環境的 PATH

建立、退出和恢復會話

直接啟動匿名會話:

1
tmux

更推薦建立命名會話:

1
tmux new -s work

work 可以換成專案名、伺服器名或任務名。 臨時離開時按 Ctrl+b,鬆開後按 d。這個操作叫 detach,只讓當前終端與會話分離。會話中的編譯、下載、記錄監控和指令碼仍會執行。 如果在面板裡執行 exit,則會關閉當前 shell。最後一個面板退出後,相應視窗和會話也可能結束。

操作 命令或快捷鍵
新建命名會話 tmux new -s 會話名
檢視會話 tmux ls
恢復最近會話 tmux attach
恢復指定會話 tmux attach -t 會話名
臨時退出 Ctrl+b,再按 d
重新命名當前會話 Ctrl+b,再按 $
刪除指定會話 tmux kill-session -t 會話名
存在多個會話時,tmux attach 可能提示目標不明確。先檢視名稱:
1
tmux ls

再恢復指定會話:

1
tmux attach -t work

簡寫命令也有效:

1
tmux a -t work

視窗快捷鍵

視窗類似瀏覽器標籤頁。一個會話可以有多個視窗,每個視窗又能包含多個面板。

操作 快捷鍵
新建視窗 Ctrl+b,再按 c
下一個視窗 Ctrl+b,再按 n
上一個視窗 Ctrl+b,再按 p
最近使用的視窗 Ctrl+b,再按 l
切換到視窗 0–9 Ctrl+b,再按數字鍵
檢視視窗列表 Ctrl+b,再按 w
重新命名視窗 Ctrl+b,再按 ,
關閉當前視窗 Ctrl+b,再按 &
關閉視窗時 tmux 會要求確認。輸入 y 後,視窗中的所有面板和程式都會結束,不要把 & 和 detach 使用的 d 混淆。
視窗編號超過 9 時,使用 Ctrl+b w 從列表中選擇。也可以按 Ctrl+b ',輸入視窗編號後按 Enter。

分屏與面板操作

面板是同一個視窗中的獨立終端區域。

操作 快捷鍵
左右分屏 Ctrl+b,再按 %
上下分屏 Ctrl+b,再按 "
切換面板 Ctrl+b,再按方向鍵
切換到下一個面板 Ctrl+b,再按 o
顯示面板編號 Ctrl+b,再按 q
當前面板全屏或恢復 Ctrl+b,再按 z
關閉當前面板 Ctrl+b,再按 x
輪換預設佈局 Ctrl+b,再按空格
Ctrl+b q 後,每個面板會短暫顯示編號。編號仍在螢幕上時按對應數字,可以直接跳轉。
Ctrl+b z 只改變顯示範圍,不會刪除其他面板;再次執行即可恢復原佈局。

調整面板大小

常用操作是先按 Ctrl+b,再按住 Ctrl 並連續按方向鍵。若終端截獲組合鍵,可以使用 tmux 命令。 先按 Ctrl+b :,再輸入:

1
2
3
4
resize-pane -L 5
resize-pane -R 5
resize-pane -U 3
resize-pane -D 3

LRUD 分別表示左、右、上、下,數字表示調整的單元數量。 按百分比設定當前面板寬度或高度:

1
2
resize-pane -x 70%
resize-pane -y 60%

滾動檢視歷史輸出

普通終端的滾輪有時無法直接滾動 tmux 歷史。先進入複製模式:

1
Ctrl+b [
操作 按鍵
逐行移動 方向鍵
向上翻頁 PageUp
向下翻頁 PageDown
跳到頂部 g,需使用 vi 模式
跳到底部 G,需使用 vi 模式
搜尋 /,需使用 vi 模式
退出複製模式 qEsc
如果 gG/ 的行為不同,通常是當前使用 emacs 風格按鍵。可在 ~/.tmux.conf 中啟用 vi 模式:
1
set-window-option -g mode-keys vi

複製和貼上文字

使用 vi 模式時,常見流程如下:

  1. Ctrl+b [ 進入複製模式;
  2. 移動到起點;
  3. 按空格開始選擇;
  4. 移動到終點;
  5. 按 Enter 複製到 tmux 緩衝區;
  6. Ctrl+b ] 貼上。 不同版本或自定義設定可能使用 v 開始選擇、y 完成複製。按 Ctrl+b ? 可以檢視當前真實綁定。 檢視和儲存 tmux 緩衝區:
1
2
tmux show-buffer
tmux save-buffer ~/tmux-buffer.txt

開啟滑鼠操作

希望用滑鼠選擇面板、調整邊界和滾動時,在 ~/.tmux.conf 中加入:

1
set -g mouse on

重新載入設定:

1
tmux source-file ~/.tmux.conf

開啟滑鼠後,滾輪通常會自動進入複製模式。某些終端中滑鼠選擇會被 tmux 接管;需要使用終端原生選擇時,可以嘗試按住 Shift 再拖動。

一份夠用的基礎設定

編輯 ~/.tmux.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 開啟滑鼠
set -g mouse on

# 增加歷史輸出容量
set -g history-limit 50000

# 視窗和面板編號從 1 開始
set -g base-index 1
setw -g pane-base-index 1

# 關閉視窗後自動整理編號
set -g renumber-windows on

# 使用 vi 風格複製模式
setw -g mode-keys vi

# 縮短組合鍵等待時間
set -sg escape-time 10

儲存後執行:

1
tmux source-file ~/.tmux.conf

也可以按 Ctrl+b :,輸入 source-file ~/.tmux.conf。設定有語法錯誤時,tmux 會指出行號;先註釋最近新增的設定再重試,不必刪除整個檔案。

修改預設前綴鍵

如果 Ctrl+b 與編輯器快捷鍵衝突,可以改成 Ctrl+a

1
2
3
unbind C-b
set-option -g prefix C-a
bind-key C-a send-prefix

載入後,本文所有 Ctrl+b 操作都要替換為 Ctrl+a。最後一行用於把前綴傳送給巢狀 tmux。

SSH 斷開後恢復任務

遠端執行長任務時,可以按以下流程操作:

1
2
3
ssh user@server
tmux new -s train
./run-task.sh

需要離開時按 Ctrl+b d,再退出 SSH。網路意外斷開時,會話通常也會繼續存在。 重新連線後執行:

1
2
tmux ls
tmux attach -t train

tmux 只能儲存終端會話,不能讓已經報錯退出的程式自動復活。重要任務仍應儲存記錄:

1
./run-task.sh 2>&1 | tee -a task.log

常見錯誤與處理

no server running

執行 tmux ls 出現 no server running on /tmp/tmux-...,表示當前使用者沒有正在執行的 tmux server。重新建立會話即可:

1
tmux new -s work

sessions should be nested with care

這表示當前 shell 已在 tmux 中,又執行了 tmux。先檢查:

1
echo "$TMUX"

有輸出時,優先按 Ctrl+b c 新建視窗,或用以下命令切換會話:

1
tmux switch-client -t 會話名

attach 後畫面尺寸不正常

同一會話連線了尺寸不同的終端時,顯示區域可能受較小客戶端影響。可在恢復時斷開其他客戶端:

1
tmux attach -d -t work

檢視現有客戶端:

1
tmux list-clients

快捷鍵沒有反應

依次檢查:

  1. 是否先按前綴並鬆開;
  2. 前綴是否已在設定中修改;
  3. 終端或遠端桌面是否截獲組合鍵;
  4. 是否處於巢狀 tmux;
  5. 當前綁定是否被外掛覆蓋。 顯示所有真實綁定:
1
Ctrl+b ?

從 shell 查詢分屏綁定:

1
tmux list-keys | grep 'split-window'

誤關閉面板或會話

tmux 沒有通用的撤銷關閉功能。關閉前應確認沒有未儲存的編輯器、互動任務或未寫入檔案的輸出。使用 tee 儲存記錄,可以降低誤關面板後的損失。

安全關閉與清理

只結束一個會話:

1
tmux kill-session -t work

保留 work,結束其他會話:

1
tmux kill-session -a -t work

結束當前使用者的整個 tmux server:

1
tmux kill-server

kill-server 會關閉該 server 管理的全部會話及其中的程式。執行前先執行 tmux ls,確認沒有仍需保留的任務。

精確指定會話、視窗和面板

tmux 命令經常使用 -t 指定目標。完整目標格式是:

1
會話名:視窗編號.面板編號

例如,work:1.2 表示 work 會話中的視窗 1、面板 2。

檢視當前目標:

1
tmux display-message -p '#S:#I.#P'

列出所有視窗:

1
tmux list-windows -a

列出所有面板及其當前命令:

1
tmux list-panes -a -F '#S:#I.#P #{pane_current_command}'

這種寫法適合在多個會話之間排查任務位置,也適合指令碼只操作指定面板,避免誤關其他終端。

目標可以省略部分欄位。當前會話中的視窗 2 可寫成 :2,當前視窗中的面板 1 可寫成 .1。自動化指令碼中建議使用完整目標,減少當前焦點變化帶來的歧義。

從 Shell 建立視窗和分屏

除了鍵盤快捷鍵,也可以直接呼叫 tmux 命令。向 work 會話新建視窗:

1
tmux new-window -t work -n logs

在視窗中建立左右分屏:

1
tmux split-window -h -t work:logs

建立上下分屏:

1
tmux split-window -v -t work:logs

建立面板時直接執行命令:

1
tmux split-window -h -t work:logs 'tail -f /var/log/syslog'

帶命令的面板會在命令結束後關閉。如果希望檢視最後輸出,可讓 shell 在命令後保留:

1
tmux split-window -h -t work:logs 'tail -n 100 /var/log/syslog; exec bash'

遠端生產環境中不要把需要密碼的命令直接寫進 Shell 歷史。使用現有認證機制,並限制記錄面板只讀取必要檔案。

向背景會話傳送命令

send-keys 可以向指定面板模擬鍵盤輸入:

1
tmux send-keys -t work:server.0 'npm run dev' Enter

向正在執行的前臺程式傳送 Ctrl+c

1
tmux send-keys -t work:server.0 C-c

傳送命令前先確認面板當前執行的程式:

1
tmux display-message -p -t work:server.0 '#{pane_current_command}'

如果輸出是編輯器、資料庫客戶端或其他互動程式,直接傳送文字可能造成資料修改。自動化時應為任務準備專用會話和固定視窗名,不要依賴臨時編號。

建立背景會話並啟動任務:

1
2
tmux new-session -d -s backup
tmux send-keys -t backup:0 'bash ~/backup.sh 2>&1 | tee -a ~/backup.log' Enter

檢查會話是否存在:

1
2
tmux has-session -t backup
echo $?

返回碼為 0 表示目標會話存在。它只能說明 tmux 會話還在,不能證明指令碼成功,應同時檢查退出狀態、記錄或輸出檔案。

捕獲面板輸出用於排錯

不進入會話也可以讀取面板歷史:

1
tmux capture-pane -p -t work:server.0

只獲取最近 100 行:

1
tmux capture-pane -p -S -100 -t work:server.0

儲存到檔案:

1
tmux capture-pane -p -S -500 -t work:server.0 > server-output.txt

capture-pane 讀取的是 tmux 儲存的螢幕和歷史內容。若程式輸出超過 history-limit,更早內容已經無法恢復。

需要長期審計的任務應讓程式自身寫記錄,而不是隻依賴 tmux 歷史。記錄中若包含令牌、連線字串或使用者資料,還要設定合適的檔案權限和保留週期。

檢查會話是否仍有客戶端

下面的命令可以檢視哪些終端仍連線著 tmux:

1
tmux list-clients -F '#{client_name} session=#{session_name} tty=#{client_tty}'

如果維護視窗前需要獨佔會話,先通知其他使用者,再決定是否使用 attach -d 斷開其客戶端。

客戶端列表為空不代表任務已經結束,只表示當前沒有終端正在顯示該會話。

常見問題

detach 會停止程式嗎?

不會。Ctrl+b d 只斷開客戶端。程式是否繼續執行,還取決於伺服器是否關機、重啟或由其他機制終止程式。

為什麼 Ctrl+b % 輸入了百分號?

通常是沒有觸發前綴,或把按鍵按成了同時組合。先按 Ctrl+b 並全部鬆開,再輸入 %;多數鍵盤佈局需要按 Shift+5

為什麼雙引號不好按?

先觸發前綴,再使用當前鍵盤佈局對應的雙引號組合,通常是 Shift+'。也可以在設定中重新綁定一個更方便的分屏鍵。

如何確認當前會話、視窗和面板?

1
tmux display-message -p '#S:#I.#P'

輸出依次是會話名、視窗編號和面板編號。

快速回顧

tmux 的結構分為三層:會話儲存整套工作環境,視窗區分任務,面板負責分屏。 日常流程是用 tmux new -s 名稱 建立會話,透過視窗和分屏組織任務,按 Ctrl+b d 安全離開,再用 tmux attach -t 名稱 恢復。 忘記快捷鍵時按 Ctrl+b ? 檢視當前設定中的真實綁定,比死記完整列表更可靠。