GNU Screen

出自 Arch Linux 中文维基

本文內容或本節內容已經過期。

原因: 請提供模板的第一個位置參數以概括原因。 (在Talk:GNU Screen討論)

這篇文章或章節的翻譯不反映原文。

原因:Last updated in 2018 (532799), out of sync with English page(在 Talk:GNU Screen# 中討論)

GNU Screen是一個全屏窗口管理器,它在多個進程(通常是交互式shell)之間復用物理終端。當屏幕當前不可見時,甚至整個屏幕會話與用户終端分離時,Screen中運行的程序也會繼續運行。 有關功能的説明,請參閱官方GNU手冊(GNU Screen manual)。

安裝[編輯 | 編輯原始碼]

可以用官方軟件倉庫中的 screen 包來安裝 GNU Screen.

基礎[編輯 | 編輯原始碼]

可以通過 Ctrl+a 和其他鍵來輸入命令。通過 ~/.screenrc 中的escape選項來改變 escape 鍵。例如:

escape ``

將 escape 鍵設為 `

常見命令[編輯 | 編輯原始碼]

C-a ?

列出命令和默認按鍵(非常重要)

C-a "

窗口列表

C-a 0

打開窗口 0

C-a A

重命名當前窗口

C-a c

創建新窗口

C-a S

將當前區域劃分為兩個區域

C-a <TAB>

將輸入焦點轉至下一區域

C-a C-a

在當前區域和之前區域間轉換

C-a <ESC>

進入複製模式(用 enter 鍵來選擇一段文本)

C-a ]

粘貼文本

C-a Q

關閉除當前區域外所有區域

C-a d

從當前 screen 會話斷開,並保持其運行。用 screen -r 來恢復。

命令提示符[編輯 | 編輯原始碼]

  • Ctrl+a :quit關閉所有窗口並關閉屏幕會話
  • Ctrl+a :source ~/.screenrc重新加載screenrc配置文件(也可以使用/etc/screenrc)

從窗口 1 開始[編輯 | 編輯原始碼]

默認的第一個窗口是 0 號。如果不想要窗口 0,而是從 1 號開始,將以下內容寫入 ~/.screenrc

bind c screen 1
bind ^c screen 1
bind 0 select 10                                                            
screen 1

嵌套的 Screen 會話[編輯 | 編輯原始碼]

在一個嵌套的 screen 會話中卡住是非常容易的。一個常見的情況是:你從一個 screen 會話內啟動了一個 ssh 會話,在這個 ssh 會話中,你又啟動了 screen。默認地,響應 C-a 命令的是最先啟動的外層screen。如果要向內層 screen 輸入命令,用 C-a a 加上你的命令。例如:

C-a a d

斷開內層 screen 會話

C-a a K

殺死內層 screen 會話

消除殘餘的編輯文本[編輯 | 編輯原始碼]

當你在 screen 內打開文本編輯器再關掉它,文本內容仍然會在終端上顯示。要解決這點,將下列內容加入 ~/.screenrc 中:

altscreen on

使用 256 色[編輯 | 編輯原始碼]

默認地,screen 使用 8 色終端模擬器。如果你用的是支持 256 色的終端,可以通過如下命令來支持更多的色彩:

term screen-256color

如果在 xterm 中仍不能顯示 256 色,試試下面的命令:

attrcolor b ".I"    # 允许加粗色彩--由于某些原因是必须的
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'   # 告诉screen如何设置颜色。AB 指背景,AF 指前景
defbce on    # 使用当前背景色来显示删除的字符

在 Rxvt-Unicode (urxvt) 中使用 256 色[編輯 | 編輯原始碼]

如果你用的是官方軟件倉庫中的 rxvt-unicode,你可以將下面這行加入你的 ~/.screenrc 來啟用256色:

terminfo rxvt-unicode 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'

信息狀態欄[編輯 | 編輯原始碼]

默認的信息狀態欄可能會有些簡單。你可以使它變得更有用:

hardstatus off
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W} %c %{g}]'

關閉歡迎信息[編輯 | 編輯原始碼]

將下面這行加入到 ~/.screenrc

startup_message off

讓標題欄動態顯示 urxvt|xterm|aterm 窗口名稱[編輯 | 編輯原始碼]

這非常簡單,只是將你當前的 hardstatus 欄變成 caption 欄,並編輯對應項:

backtick 1 5 5 true
termcapinfo rxvt* 'hs:ts=\E]2;:fs=\007:ds=\E]2;\007'
hardstatus string "screen (%n: %t)"
caption string "%{= kw}%Y-%m-%d;%c %{= kw}%-Lw%{= kG}%{+b}[%n %t]%{-b}%{= kw}%+Lw%1`"
caption always

這會在你的終端模擬器標題欄顯示 "screen (0 bash)" 之類的內容。標題欄提供日期、當前時間,並給 screen 窗口加上顏色。

使用 X 滾動機制[編輯 | 編輯原始碼]

滾動緩存可以用 C-a [ 來查看。但是這很不方便。要使用滾動條,如 xterm 或 konsole,將下面這行加入 ~/.screenrc

termcapinfo xterm* ti@:te@

添加 GRUB 條目來啟動進入 Screen[編輯 | 編輯原始碼]

如果你主要使用 X,但偶爾將Screen作為窗口管理器運行,這裏有種通過為 Screen 添加 GRUB 條目的方法。

GRUB 允許你指明想要的運行級別,因此在這裏我們使用運行級別 4。複製一條合適的 GRUB 條目,並給內核選項表添加 4,像這樣:

# (0) Arch Linux
title  Arch Linux Screen
root   (hd0,2)
kernel /vmlinuz-linux root=/dev/disk/your_disk ro acpi_no_auto_ssdt irqpoll 4
initrd /initramfs-linux.img

/etc/inittab 添加一些條目來指明哪些將在運行級別 4 下進行,將 <user> 換為你的用户名:

# GNU Screen on runlevel 4
scr2:4:respawn:/sbin/mingetty --autologin <user> tty1 linux

上面這行使用 mingetty 來啟動時自動登錄。你需要安裝[Official repositories (簡體中文)|官方軟件倉庫]]中的 (mingettyAUR。inittab 的行分隔符是冒號。第一部分(scr*)僅僅是一個id。第二部分是運行級別:只在運行級別 4 下進行(默認地 4 沒有被使用--3 是默認的字符界面登錄,5 是 X 登錄)。'Respawn' 讓 init 重複這條命令(即自動登錄),如果用户註銷。 當我們使用運行級別 4 時,我們需要沒有其他任何程序在虛擬終端 1 下運行。所以將 4從 agetty 的第一行移去:

c1:235:respawn:/sbin/agetty -8 38400 vc/1 linux

一旦我們登錄,我們想要保證 screen 已經啟動。將下列內容添加到你的~/.bash_profile

vico="$(tty | grep -oE ....$)"
case "$vico" in
  tty1) TERM=screen; exec /usr/bin/screen -R arch;;
esac

這會檢查當前運行級別,如果是 4 就在自動登錄後立即啟動一個 screen 會話。

也可以改成 X 之後在一個虛擬終端裡運行 screen,只需檢查當前的 tty 而不是運行級別即可。下面是檢查我們是否在虛擬終端 3 上:

vico="$(tty | grep -oE ....$)"
case "$vico" in
  vc/3) TERM=screen; exec /usr/bin/screen;;
esac

將 inittab/mingetty 設為在運行級別 5 下自動登錄到 vc/3 即可。

修正啟動 screen 時 Midnight Commander 無反應的問題[編輯 | 編輯原始碼]

這個問題在某些情況下(需要進一步檢查)old gpm bug 會出現。所以在 screen 內運行 mc,會得到無反應的 screen 窗口。嘗試在運行 mc 之前殺死 gpm 守護進程,或是在 /etc/rc.conf 中禁止 gpm。 In some cases (need deeper inspection) old gpm bug gets alive. So, then you try to run mc inside screen, you get a frozen screen window. Try to kill gpm daemon before starting mc and/or disable it in /etc/rc.conf.

參見[編輯 | 編輯原始碼]