Tmux 入門介紹

胡屹發表於2015-06-03

簡介

有關 Tmux 的教程多達 4257 篇,這個數還是我粗略統計的。而我這篇入門教程的目的是讓你從“我去,Tmux 是神馬”極速地轉變到“Tmux 真牛B”!

那麼,我們就開始吧!

為什麼要用 Tmux

tmux 在很多方面都很有用。就我而言,由於 tmux 允許隨時隨地斷開或重新接入會話(Session),所以最大的作用就是在遠端伺服器上持久地儲存工作狀態。

例如,你可以在伺服器上新建一個會話並命名為“nodeapi”,然後用它來挖掘 node REST API 的漏洞(這是我現在的專案)。或者假設你正在咖啡店裡工作,需要編譯一些程式碼,而編譯要花費 2 個小時才能完成(如果是和我一起工作的話),這時你又不得不離開咖啡店。如果使用了 tmux,你就可以輕鬆地斷開當前的會話,並於稍後方便時重新接入該會話,繼續工作。

這真是太方便了。

“如何使用 tmux 才能開啟多個會話,如何在會話中開啟多個標籤(Tab),如何在標籤中開啟多個視窗(Window),又如何在視窗中開啟多個窗格(Pane)”,也許有些人對這些操作更感興趣。而我很少這樣做的,因為我不喜歡開啟太多的——實際上是儘可能少地開啟——這些東西。因此,這篇入門教程主要講解的也是作為簡單的可持久化遠端會話模型的 tmux。

遠端操作計算機的生活方式

機動性是 tmux 帶給使用者的最大價值。有很多開發者都是在伺服器上進行所有工作的,他們只需從某處連線上伺服器就可以開始工作了。有了 tmux(或者其他類似的工具),你就可以先坐在舊金山的某個咖啡店裡開始在伺服器上進行構建的工作,然後斷開會話去趕飛機,待飛機降落到紐約市後再繼續進行剛才的工作。

tmux 帶來的另一個好處是在移動辦公中,作為客戶端的計算機變得不再那麼重要了。只需要升級你的筆記本,然後從版本庫中克隆出 vim 和 tmux 的配置檔案,就可以再次回到配置最優的操作環境了。而且這一切只需要短短的幾分鐘。

總之,這些就是人們喜愛 tmux 的原因。當然即使你的生活不是四處奔波,也一樣能體驗到 tmux 帶來的好處。

那麼 screen 呢?

問得好。tmux 和 screen 很像,但比 screen 更好。要問好在哪裡,簡單的回答就是雖然與 screen 的功能相同,但是 tmux 設計得更好。screen 雖然可用,但是很不穩定。

以下是一些 tmux 超越 screen 的地方:

  • screen 的專案大體上已經終止了,並且程式碼中有大量的問題
  • tmux 是一個活躍的專案,並且其程式碼庫經常進行更新
  • tmux 使用的是真正的客戶端/伺服器模型,而 screen 只是模擬了這種模型的行為
  • tmux 同時支援 emacs 和 vim 的快捷鍵
  • tmux 支援自動重新命名視窗
  • tmux 可以高度的指令碼化
  • tmux 的視窗分割功能更加先進

這些優點已經足夠了吧,開始使用 tmux 吧。

基礎

首先要告訴諸位的是 tmux 中的一個全域性的快捷鍵開關,開關開啟後就可以通過快捷鍵完成很多工。

tmux 的快捷鍵

tmux 預設使用 Ctrl-b 作為啟用快捷鍵的開關,開關開啟後就可以通過快捷鍵迅速呼叫大量的功能。下面就給出一些基本功能的呼叫方法:

首先按下

$ Ctrl-b

接下來就可以按下一些後面將會講解的快捷鍵了。不過先不要著急,可以先為能方便地使用組合鍵 Ctrl-b 做一點準備。不妨在作業系統中將鍵盤上的 CAPSLOCK 鍵對映為 Ctrl 鍵,這樣當需要按下這個組合鍵時,小拇指的移動就可以更加舒服了。

執行 tmux

好了,下面讓我們從執行 tmux 開始。首先選擇一臺你希望在斷開會話後依然可以重新接入的計算機(對我來說這通常是遠端伺服器),然後在上面執行如下的命令:

$ tmux

很簡單對吧。這樣就開啟了一個 tmux 的會話,你可以斷開這個會話並在稍後再重新接入。

顯示所有會話

由於 tmux 的理念是可以開啟多個會話,並且可以自由地斷開會話後重新接入,為此我們需要首先能看到可用的會話。有兩種方法可以實現這個目的:

上面兩種方法的效果相同,都可以得到類似下面的結果:

新建會話

下面我們就來新建一個會話。可以使用 new 命令新建會話,並且該命令允許以引數的形式傳遞一個會話名。我的建議是在新建時要提供一個會話名以便於日後管理。

接入一個之前的會話

既然我們已經建立了多個帶有名稱的會話,那麼就可以隨時接入了,有幾種方法可以實現接入會話:

可以簡單地輸入 tmux a 命令,這樣可以接入第一個可用的會話:

或者可以通過引數指定一個想接入的會話:

從會話中斷開

可以使用 detach 命令斷開已有的會話(因此才會有稍後重新接入會話這麼一說)。

$ tmux detach

也可以使用快捷鍵斷開會話:

$ Ctrl-b d

關閉會話

要關閉會話的話,可以使用如下的命令,該命令和接入會話時所使用的命令很像:

$ tmux kill-session -t session-name

提示:關閉視窗時也可以使用類似的命令,只不過要把 kill-session 換成 kill-window。另外,還可以使用 tmux killall 同時關閉 tmux。

配置

與其他工具一樣,一旦配置好了 tmux,使用起來就將會非常順手。下面就給出幾個通常需要配置的專案:

  • tmux 的主要快捷鍵
  • 螢幕下方的狀態條
  • 自定義的各種快捷鍵

我使用了一些相當簡單的配置:

access log,error log和system log。

tmux 預設會先從 /etc/tmux.conf 載入系統級的配置項,然後從 ~/.tmux.conf 載入使用者級的配置項。也可以使用引數 -f 指定一個配置檔案。——譯者注

這裡有一點值得注意,我使用了 ipecho.net 而不是 icanhazip 來獲取計算機當前的 IP 地址(IPv4)。雖然也有很多教程在使用 icanhazip,但是憑我的經驗,ipecho.net 的速度更快,更穩定。

提示:如果你感興趣,可以來這裡檢視我使用的最新配置。

高階功能

我平時常用的功能就是這些了。不過,我也會使用一些 tmux 中更強大的功能。

視窗和窗格

這些高階功能之一就是 tmux 可以將一個會話分割成若干個稱為視窗(Window)和窗格(Pane)的相互分離的元件。這種邏輯上的分割使使用者可以輕鬆安排各種各樣的操作。

下面就來看一看這幾個概念之間的關係。

層次結構

如上圖所示,一個會話(Session)可以包含多個視窗,一個視窗(Window)可以包含多個窗格(Pane)。這就是我對這些概念的簡單理解。當然如果諸位有更權威或者更實用的解釋,我很樂意洗耳恭聽。

  • 會話適用於分別管理大的工作內容,例如日常工作,實驗或是系統管理,都可以分別在一個會話中進行。
  • 視窗適用於分別管理這些大工作中的專案。例如,在用於實驗的會話中可能有一叫做 noderestapi 的視窗用於除錯 node REST API,有一個叫做 lua 的視窗用於除錯 lua 指令碼。
  • 窗格適用於檢視當前的專案。例如,在系統管理的會話中有一個叫做 logs 的視窗,在這個視窗中可以開啟多個窗格分別用於檢視 access log,error log和system log。

我們也可以在會話中直接建立窗格,而不需要先建立一個視窗。我有時也會這樣做。當閱讀完“層次結構”這一小節,希望我的這種做法沒有聽起來那樣恐怖。正如我在一開始談到的,我更傾向於簡化 tmux 的使用。

在窗格間移動游標

雖然有預設的在窗格間移動游標的方法,但是我並不清楚是什麼。因為我習慣用 vim,所以我會用hjkl 鍵在窗格間移動游標。為此,要加入如下的配置:

建議

以下幾條建議也許會有助於諸位的 tmux 之旅:

  1. 儘可能少開啟會話和視窗。人類沒有我們自認為的那樣善於處理多工。雖然開啟 47 個窗格顯得很強大,但是這並沒有我們想象的那樣實用。
  2. 當確實要使用視窗和窗格時,花一點時間為它們起個有意義的名字。這非常有用,如果只是用 0、1、2 這樣的名字,切換會話或視窗時就會非常麻煩。
  3. 從基礎的配置、操作開始使用 tmux,別一上來就把自己搞糊塗了。我曾遇到過很多人,他們花費了大量的時間配置 vim 或 tmux,而最終帶來的結果卻是不但把自己繞進去了,而且專案也沒有進展。

快捷鍵參考

按下 Ctrl-b 後的快捷鍵如下:

基礎

  • ? 獲取幫助資訊

會話管理

  • s 列出所有會話
  • $ 重新命名當前的會話
  • d 斷開當前的會話

視窗管理

  • c 建立一個新視窗
  • , 重新命名當前視窗
  • w 列出所有視窗
  • % 水平分割視窗
  • " 豎直分割視窗
  • n 選擇下一個視窗
  • p 選擇上一個視窗
  • 0~9 選擇0~9對應的視窗

窗格管理

  • % 建立一個水平窗格
  • " 建立一個豎直窗格
  • h 將游標移入左側的窗格*
  • j 將游標移入下方的窗格*
  • l 將游標移入右側的窗格*
  • k 將游標移入上方的窗格*
  • q 顯示窗格的編號
  • o 在窗格間切換
  • } 與下一個窗格交換位置
  • { 與上一個窗格交換位置
  • ! 在新視窗中顯示當前窗格
  • x 關閉當前窗格> 要使用帶“*”的快捷鍵需要提前配置,配置方法可以參考上文的“在窗格間移動游標”一節。——譯者注

其他

  • t 在當前窗格顯示時間

希望這篇文章有助於你理解 tmux。

如果喜歡這篇文章,那麼不妨來這裡再讀一讀我寫的其他入門級技術文章。

參考資源

  1. The man page.
  2. A thousand other great tutorials.
  3. man 手冊
  4. 大量精彩教程

相關文章