網上很多地方都說Tmux比GNU Screen要好用,不過無意間看到這篇Switching from tmux to GNU Screen之后,我發現GNU Screen的窗口/區域概念更好,至少是更適合我(雖然相對Tmux有不少小缺點)。
優點1: GNU Screen的窗口/區域/布局概念更適合某些場景
Tmux里面的窗口概念是: 程序是跑在pane里面的,每個window可切分成多個pane,一般我們會並行開多個window.這樣每個window多半用於不同的事情.這種方式要把一個window里面的某個pane移動到另外一個windows
GNU Screen的窗口與區域關系更接近Emacs里面buffer與window的關系:
- gnu screen里面的region相當於tmux里面的pane,而screen的window更類似於跑在tmux pane里面的程序;
- 與tmux不同的是,一般情況下程序/窗口是隱藏的,每次只把一個程序/窗口切換到當前region來(tmux里面一般情況下所有程序都會在某個window的某個pane里面顯示者,除非有其它pane被最大化導致當前pane被隱藏了)
GNU Screen里面沒有tmux里面的window那樣的東西,它的layout倒是跟tmux的window有點像,雖然我們可以從一個layout切換到另外一個layout,但layout只是region的容器,而不是window的容器,兩個layout里面是可以查看同一個應用(window)的.
不實際操作一下的話,不一定能感受到上面的差異.網上找到兩個圖說明兩者概念的不同,也許對讀者有所幫助(來自Differences between tmux vs screen - Wesley Tanaka )
gnu screen:
tmux:
這樣的好處是:
- 一旦確定了一個layout,剩下的大部分時候都是切換到不同的程序來工作,而不需要切換到不同程序工作時來回調整當前窗格的大小(因為我們很多時候都想讓當前程序占據比較大的面積,但又未必是全屏-比如一個窗口看代碼,一個窗口調試,還一個窗口查文檔).
- 兩個人(或者兩個顯示器)可以attach到同一個session,然后各自工作在自己的"視圖"上(即可以跟不同的程序交互)-之前在windows上用putty連到開發用機的時候,我總找不到一個好方法讓tmux充分利用兩個顯示器(putty最大化不能占據兩個顯示器,自己拖又麻煩,就算拖大了,有時從其它單顯示器機器連上來tmux的寬度又縮回去了)
不過有幾個小地方需要注意:
- 在當前region下,切換到一個window時,window不會自動根據當前region大小調整窗口(因為它也有可能在另外一個region里面顯示),需要用
C-a F
調整一下.對應命令是fit
(change the window size to the size of the current region). - 要attach到一個session的話,需要用命令
screen -r
,但一旦這個session已經被attach了,其它客戶端要attach上來,得用screen -x
優點2: zmodem集成
跟遠程機器打交道時比較煩人的一個事情是上傳下載文件,尤其是要傳送文件的源目錄或者目標目錄在一個較深的路徑的時候.zmodem提供一個比較便捷的方法.
至於具體用法,官方的文檔Zmodem - Screen User's Manual講得很語焉不詳,這篇GNU Screen and Zmodem | Adam Monsen 寫得很詳細:
Send a file from the remote host to the local host:
- start a Screen session on the local host
- configure Screen to “catch” zmodem traffic (CTRL-A:zmodem catch
) - execute
sz FILE
from the command line- hit
when Screen brings up the default receive command ( :!!! rz -vv -b -E
)- bam, the file is available on the local host!
Send a file from the local host to the remote host:
- start a Screen session on the local host
- configure Screen to “catch” zmodem traffic (CTRL-A:zmodem catch
) - execute
rz
from the command line (no need to specify filename)- add local filename when Screen brings up the default send command(
:!!! sz -vv -b
), then hit- bam, the file is available on the remote host!
從描述上來看,從遠端發送一個文件到screen這邊還算比較方便,因為大多數情況下我們在遠端機器上已經進入了文件所在的目錄,只需要直接發起 sz FILE
就可以了,screen接收后就存放在它的"當前目錄";不過從screen發送一個文件就有點不爽,因為這里要輸入待發送文件的全路徑,這里並沒有一個瀏覽文件的功能.
其它小問題
縱向分割
網上很多比較gnu screen和tmux的文章都列了一個理由是gnu screen不支持縱向分割.不過4.2.0版本(Apr/17/2014)已經支持了( /'-v' parameter to 'split' command for vertical splits/ ).
另外有一點提醒一下: 在漫長的4.1.x時代,一些發行版集成了一個第三方補丁來支持縱向分割,當時實現的縱向分割命令是vert_split
(而4.2.0版本里面實現的是split -v
).如果你的screen不支持split -v
,那么可以試試有沒有vert_split
這個命令.
鼠標
用mousetrack on
命令即可開始鼠標支持(用C-a :
輸入,或者放入~/.screenrc
),開啟后可以用鼠標切換region.
但它沒有tmux的鼠標能力強,不能mouse-select-window
的功能(即使你將hardstatus
配置為顯示window列表,也不行),也不能mouse-resize-pane
.
在 ~/.screenrc
里面加入 termcapinfo screen*|term* ti@:te@
可以讓screen支持用鼠標滾輪來回滾scroll buffer(注意設置此選項需要重啟screen session,而即時通過C-a :
來輸入是不行的),但與tmux不同的是它不會自動進入copy-mode, 也就是說需要用C-a[
進入copy-mode后鼠標滾輪才有作用. 對於上述配置的詳細解釋請參看Using the scrollwheel in GNU screen - Stack Overflow
Emacs用戶
如果你是emacs用戶,要設置以下幾個選項:
escape ^Bb
將熱鍵改為C-b, 按C-b b
的時候才向里面的應用程序發送C-b
.因為默認的C-a
在Emacs和命令行里面用的還是比較多的如果這個vbell off
不想在C-g
的時候看到什么閃屏,就設置這個吧defflow auto
不想讓C-s
把屏幕鎖住,就需要這個,具體請查看: Flow Control - Screen User's Manual- 如果你在Emacs里面用了F12, F9這些功能鍵的話,不要用ubuntu的byobu(除非你願意去修改某一方的快捷鍵)
參考資料
基本入門
- GNU Screen (簡體中文) - ArchWiki
- GNU Screen - ArchWiki
- 對話 UNIX: 使用 Screen 創建並管理多個 shell
- linux 技巧:使用 screen 管理你的遠程會話
- Top 10 Awesome Linux Screen Tricks – UrFix's Blog
gnu screen 與 tmux 比較
- Why You Should Try tmux Instead of screen
- Switching from tmux to GNU Screen
- Differences between tmux vs screen - Wesley Tanaka