iT邦幫忙

2025 iThome 鐵人賽

DAY 30
2
Software Development

上班族的命令列 (CLI) 生存手冊系列 第 30

Day30 生活品質篇:一次操作多個終端機?Terminal Multiplexer

  • 分享至 

  • xImage
  •  

嗨!歡迎回到上班族的命令列生存手冊!!為什麼有些 YouTuber 的終端機這麼帥可以同時跑這麼多個 Shell?今天開始你也加入他們的行列!這一個章節要來介紹 Terminal Multiplexer (多工器)。

還記得在最初的起點有說明,Shell 是跑在 Terminal Emulator 上面的程式嗎?這個終端機的 Multiplexer 又再抽離一層,它會將 Shell 跑在自己上面。這有帶來好處,Terminal Multiplexer 會一直跑在背景,而不會因為終端機程式被關閉而被關閉。換句話說,我們所有的作業以及執行的歷程都還存在,下次開啟任何一個終端機程式只要重新進入 Terminal Multiplexer 裡頭就可以無縫接軌。

讀者可能會疑惑這個好處在哪?試想在遠端的 Server 環境,如果每次連進去一切都要重來,頭也會滿大的,幸好透過 Terminal Multiplexer 就可以回復上次的工作。

安裝

讀者可能有聽過一個名詞 tmux (其實在 Day03 就講過這個名詞了),雖然很老牌但學習曲線有點抖,所以筆者在這邊推薦另一款比較近代開發的 zellij。zellij 對比 tmux,會把自身可以用的操作都顯示在畫面上,使用者只要照著畫面按,大多都能執行預期的功能。

zellij 的安裝頁面找到自己運行的發行版,或者使用 homebrew 來安裝:

$ brew install zellij

安裝好後輸入:

$ zellij

會發現好像在 Shell 裡頭又開了一個 Shell 的感覺。😵‍💫
先來講一下觀念。

觀念

💥 請把 Shell 的 Session 和 Terminal Multiplexer(像是 zellij) 的 Session 分開來看

Pane (窗格)

一個 Pane 都會跑一個屬於自己的 Shell Session。本來在終端機程式上跑的 Shell,現在會跑在 Pane 上面。

如果左右切割,那麼左右都會是各自獨立的 Pane。以此類推,如果切了四格,就是有四個 Pane,分別跑了四個 Shell Session。

Window (Tab,視窗 或 分頁)

視窗(zellij 裡頭叫做「分頁」,但 tmux 等經典應用程式用「視窗」來稱呼,是一樣的東西)是 Pane 的容器。一個 Window/Tab 裡頭可以同時存在很多 Pane。像我們一打開 zellij 啥都不做,就是標配的一個 Window 裡頭一個 Pane。(跑著一個 Shell Session)

使用者可以開多個 Window(意象就是不同的分頁表示),每個 Window 都有各自獨立的 Pane 作為不同任務的工作空間。

Session

zellij 的 Session 是 Window 的容器,一個 Terminal Multiplexer 可以開很多個 Session!裡頭有各自的 Window。本文開頭提及,如果關閉了終端機程式,只要某一個 Terminal Multiplexer 的 Session 還活著(因為 zellij 或 tmux 等會持續跑在背景),就可以重新回到一樣的 Session。(zellij 每一個 Session 都會有名子,透過同一個名子回到同一個 Session)。

層層的關係就像是:

  • Terminal Multiplexer
    • Session 01
      • Window 01
        • Pane 01
        • Pane 02
      • Window 02
        • Pane 03
    • Session 02
      • Window 03
        • Pane 04

用 zellij 來看,Session 01 有兩個分頁,第一個分頁左右分割,第二個分頁就一個整頁的 Pane;Session 02 只有一個分頁,裡頭也只有一個整頁的 Pane。

使用

Pane (窗格)

https://ithelp.ithome.com.tw/upload/images/20251014/201416159LHjtkJ7WR.png

zellij 下方有一條 Ctrl 開頭的控制條,找到想做的事情,依提示鍵入即可。

左右分割

image-002.gif

Ctrl + p 進入 Pane 的模式,會發現下面的控制條改變了,變成了 Pane 的相關功能。怎麼左右分割呢?按下 n (new) 即可。

切換焦點

image-003.gif

Pane 的功能,就先 Ctrl + p 進入 Pane 模式,在這個模式用方向鍵就能切換 Pane 的焦點,選定後按下 Enter 即可。

關閉 Pane

image-004.gif

無三不成禮,已經知道和 Pane 有關了,該做什麼?(遞麥克風) 對! Ctrl + p!發現關閉 close,也就是再按下 x。

上下分割

image-005.gif

Pane 模式的 down (也就是 d) 就是上下分割了。也注意到也可以用 right (按鍵是 r) 左右分割。

調整 Pane 的大小

image-006.gif

可以用快速鍵 Alt + + 放大目前聚焦的 Pane;用 Alt + - 縮小目前聚焦的 Pane。

Window (Tab,視窗 或 分頁)

看到這邊,應該就會漸漸的注意到 zellij 有一些操作邏輯類似的地方。

新增分頁

image-007.gif

先進入 Tab 模式,也就是 Ctrl + t,接著按下 n(new 的意思) 就是了。

切換分頁

image-008.gif

是不是有熟悉的味道阿?既然要換 Tab,就先進入 Tab 模式 Ctrl + t,在這個模式下用方向鍵,就可以左右切換分頁囉。

關閉分頁

image-009.gif

看起來應該跟 Pane 有 87 分像。進入 Tab 模式之後按下 x (也就是 close) 就行啦。

Session

離開目前的 zellij Session

image-010.gif

有兩個作法,一個就是祖傳的進入 Session 模式 Ctrl + o,接著按下 d (也就是 detach)。用這個作法離開,zellij session 還會持續跑在背景。

若是 Ctrl + q 離開(quit),則該 zellij session 也會一併關閉。

建立新的 zellij Session

image-011.gif

直接輸入 $ zellij 就能建立一個新的 session 了,只是它會隨機給一個名子。
想要更潮一點指定名稱,可以這樣開 Session:

$ zellij --session <您的大作>
如果已經在 zellij 裡面了,還能開新的 Session 嗎?

image-012.gif

可以用 Session Manager,先進入 Session 模式 Ctrl + o,接著按下 w 開啟 Session Manager。有一個 popup 會跳出來,用 Tab 鍵可以切換 Popup 視窗的標籤頁,切換到 New Session,輸入名子按下 Enter,它會詢問要不要套用一些預先設定好的調整,就看個人選擇按下 Enter 即可。

看看目前有多少 zellij Session

可以用這個指令來看目前有多少個 Session 正跑著。

$ zellij ls
如果已經在 zellij 裡面了,請使用 Session Manager

image-013.gif

請看剛剛介紹怎麼在 zellij 開新的 Session 環節,預設 Session Manager 一開啟,Popup 裡頭列出的就是正在背景跑的 zellij Session。

回去某個 zellij Session

image-014.gif

這就是本文一開始提到的,如果 zellij Session 還活著,那我們就能回去繼續原來的工作進度。先查看目前有幾個 zellij session,請使用 $ zellij ls

$ zellij a <session 名稱>

這樣子重新 attach 回 session。如果這時 zellij 只有一個 Session 在跑,那連名稱也不用打,自然就會重新回去那個唯一。

發揮想像力的時刻

既然 zellij session 是獨立出來的,那只要可以跑 zellij 的地方都能跑。也就是說,能夠在多個終端機程式存取同一個 zellij session。
例如 Ghostty 和 VSCode 裡頭的終端機共用同一個 zellij session 是辦得到的,就會像兩邊同時操作同一個 Shell 一樣。

如果已經在 zellij 裡面了,Session Manager 就可以切換 Session

Session Manager 的 popup 裡頭,能看到已經開啟的 zellij session,可以用鍵盤方向鍵選擇欲前往的 Session。

如何更換 zellij 預設的 Shell

讀者可以透過 zellij 的設定檔來調整它預設開啟 Pane 後的 Shell 是什麼。
設定擋在這邊:

$ vim ~/.config/zellij/config.kdl

請尋找這個設定:

default_shell "<這邊可能會有某個 shell>"

如果找不到則自行新增,將後方的設定調整成想設定成預設 Shell 的 path 即可。設定方式和之前教學設定終端機應用程式預設 Shell 的手法很類似,也有說明怎麼取得目標 Shell 的 path,如果忘記往前看即可。

結語

這一篇就是生活品質篇的全部內容了,從 Shell 設定開始說明了新增 alias 和 function 讓效率再加分。再介紹如何在命令列使用 Copilot,並介紹了 git 好用指令,還介紹了打了針的三劍客指令:zezabat
Java SDK 管理再也沒有這麼棒過,最後介紹了 Terminal Multiplexer 讓你左右開弓。

隨著第 30 天的到來,這一個系列文章也正式宣告結束!
希望這個閱讀之旅你學得開心,如果你從第一篇看到這邊,請誇獎下自己不間斷地閱讀吧!這顯然很不容易,雖然我早就知道你和生活品質篇介紹的工具一樣,是最棒的。

期待未來我們有緣再見囉!💐 (請導播點歌 古巨基 勁歌·金曲2 情歌王 🎶)


上一篇
Day29 生活品質篇:管理 Java SDK 不求人 SDKMan
系列文
上班族的命令列 (CLI) 生存手冊30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

1
AndyAWD
iT邦新手 2 級 ‧ 2025-10-14 22:50:20

最後一篇內容超多,太神啦

恭喜完賽

0
chiaominchang222
iT邦新手 5 級 ‧ 2025-10-14 22:57:00

下方好可愛 有畫面真羨慕

我要留言

立即登入留言