跳至內容

为应对本站因各种原因无法访问,建议用户安装 arch-wiki-docs-zh-cnCNRepo 或者 arch-wiki-docs-zh-twCNRepo 离线文档包备用,也可尝试使用经由Cloudflare CDN的替代版本aw.lilydjwg.me

GNU Screen

出自 Arch Linux 中文维基

此頁面或章節適合移動到 screen

附註: 我希望用 GNU Screen 內容替換掉 screen,並將 GNU Screen 作為 screen 的一個重定向。參見 Category talk:Disambiguation pages#Remove category。(在 ArchWiki talk:Requests#Screen 討論)


GNU Screen 是一個全屏窗口管理器,它在多個進程(通常是交互式 shell)之間復用一個物理終端。Screen 中運行的程序在其窗口當前不可見時仍可繼續運行,甚至在整個屏幕會話從用戶終端分離時也是如此。

有關功能的描述,參閱官方概述 GNU Screen 手冊

安裝 screen 軟件包。

輸入命令時按下 "轉義鍵 "Ctrl+a,然後進行鍵綁定。

有些用戶認為默認的轉義鍵 Ctrl+a 不方便。可以按照 #更改轉義鍵中的說明,將轉義鍵更改為其他鍵。

常用命令

[編輯 | 編輯原始碼]
  • Ctrl+a ? 顯示命令及其默認值
  • Ctrl+a : 進入屏幕命令提示符
  • Ctrl+a " 窗口列表
  • Ctrl+a 0 打開窗口 0
  • Ctrl+a A 命名當前窗口
  • Ctrl+a a 發送到 Ctrl+a 當前窗口
  • Ctrl+a c 創建一個新窗口(帶 shell)
  • Ctrl+a S 將當前區域水平拆分為兩個區域
  • Ctrl+a | 將當前區域垂直拆分為兩個區域
  • Ctrl+a tab 將輸入焦點切換到下一個區域
  • Ctrl+a Ctrl+a 在當前區域和上一個區域之間切換
  • Ctrl+a Esc 進入複製模式(使用 Enter 選擇文本範圍)
  • Ctrl+a ] 粘貼文本
  • Ctrl+a Q 關閉除當前區域之外的所有區域
  • Ctrl+a X 關閉當前區域
  • Ctrl+a d 脫離當前 Screen 會話,讓其繼續運行。使用 screen -r 恢復

命令提示符命令

[編輯 | 編輯原始碼]
  • Ctrl+a :quit 關閉所有窗口並關閉 Screen 會話
  • Ctrl+a :source ~/.screenrc 重載 screenrc 配置文件(也可使用 /etc/screenrc

命名會話

[編輯 | 編輯原始碼]

要創建命名會話,請使用以下命令運行 Screen:

$ screen -S session_name

要(重新)命名現有會話,請在 Screen 運行時運行以下命令:

Ctrl+a :sessionname session_name

打印標識 Screen 會話的 pid.tty.host 字符串列表:

$ screen -list

要附加到已命名的 Screen 會話,請運行此命令:

$ screen -x session_name

$ screen -r session_name

自定義 Screen

[編輯 | 編輯原始碼]

您可以根據您的個人偏好修改 Screen 的默認設置在一個包含了要在啟動時運行的命令的 .screenrc 文件裡,或者在命令模式下修改(如 Ctrl+a :vbell off)。

提示與技巧

[編輯 | 編輯原始碼]

使用 systemd 自啟動

[編輯 | 編輯原始碼]

此服務將會為指定用戶自啟動 Screen(如 systemctl enable screen@florian)。將此當作一個系統服務運行是重要的,因為 systemd --user 的實例無法保證運行,當用戶最後一個會話關閉時,實例將被終止。

/etc/systemd/system/screen@.service
[Unit]
Description=screen
After=network.target

[Service]
Type=simple
User=%i
ExecStart=/usr/bin/screen -DmS autoscreen
ExecStop=/usr/bin/screen -S autoscreen -X quit

[Install]
WantedBy=multi-user.target

更改轉義鍵

[編輯 | 編輯原始碼]

修改默認的轉義鍵是個好想法,不僅因為 「a」 通常使用左小拇指來打,而且因為 Ctrl+a 被綁定了常用命令 beginning-of-lineGNU Readline 和類 Bash 的 Shell 裡。

轉義鍵可以在 ~/.screenrc 中使用 escape 項來更改,或者給 screen 傳入 -e 選項。

例如,如果您發現您很少使用 Ctrl+j 組合鍵在您的 Shell 和編輯器中,您就可以用 escape ^Jj 把轉義鍵設定為 Ctrl+j。第二個 「j」 表示,您可以通過依次按下 Ctrl+jj 的按鍵序列,向終端發送一個原始的 Ctrl+j 信號。對於 Dvorak 鍵盤布局的用戶,Ctrl+tescape ^Tt)可能會更方便。

比較少見的包括 escape `` 可以把轉義鍵設定為 `,或者 escape ^^^ 可以將其設定為 Ctrl+^

在 Screen 的文檔中,轉義鍵也被叫作「指令字符」(command character)。

以窗口1啟動

[編輯 | 編輯原始碼]

默認情況下,第一個窗口是0。如果您更希望從窗口1啟動而不是窗口0, 請在您的配置文件中添加以下內容:

~/.screenrc
bind c screen 1
bind ^c screen 1
bind 0 select 10                                                            
screen 1

嵌套 Screen 會話

[編輯 | 編輯原始碼]

在一個嵌套的 Screen 會話當中很可能被卡住。一個很現實場景:當您從一個 Screen 會話中打開一個 SSH 會話時,在這個 SSH 會話下又開了一個 Screen會話。默認情況下,外面啟動的 Screen 會話會先接受 Ctrl+a 命令. 要給內部的 Screen 會話發送命令,請使用 Ctrl+a a,接着輸入您的命令。例如:

  • Ctrl+a a d 脫離內部的 Screen 會話。
  • Ctrl+a a K 終止內部的 Screen 會話。

在每個 Shell 中啟動 Screen

[編輯 | 編輯原始碼]

對於 Bash 和 Zsh,在您的 .bashrc.zshrc 中設定命令別名之前請加入以下片段:

~/.bashrc or ~/.zshrc
if [[ -z "$STY" ]]; then
   screen -xRR session_name
fi

使用256色

[編輯 | 編輯原始碼]

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

原因: screen 4.4 設定了 $TERMscreen.$TERM,儘管 這個手冊中描述的不一樣。即不需要修改它在 ~/.screenrc 中。參見: (在Talk:GNU Screen討論)

默認情況下,Screen 使用8色的終端模擬器。為了顯示更多顏色,您需要一個支持更多顏色的終端並設定一個正確的 term 值。這將會使用 terminfo 來指明ANSI 轉義碼將會怎麼解析。在 terminfo 數據庫結構中必須存在一個條目,ncurses 提供了許多常用項存放在 /usr/share/terminfo/ 中。

先試一下通用值:

~/.screenrc
term screen-256color

如果這不起效,請根據您的終端嘗試以下設置。當使用基於 xterm 的終端時:

~/.screenrc
term xterm-256color

當使用 rxvt-unicode 時:

~/.screenrc
term rxvt-unicode-256color
注意:/usr/share/terminfo/r/rxvt-unicode-256color is provided by rxvt-unicode-terminfo, which is installed as a dependency of rxvt-unicode。然而,如果您使用 SSH 登入您的服務器並在其中運行了 screen 命令,此處的 terminfo 文件可能會在服務器上無效。對於這種情況建議複製 /usr/share/terminfo/r/rxvt-unicode-256color 到服務器上,它可以被存為 ~/.terminfo/

若以上方案實在行不通,請嘗試使用 termcapinfo 設定:

~/.screenrc
attrcolor b ".I"    # allow bold colors - necessary for some reason
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'   # tell screen how to set colors. AB = background, AF=foreground
defbce on    # use current bg color for erased chars

帶有更多信息的狀態欄

[編輯 | 編輯原始碼]

默認的狀態欄可能有些欠缺。您可能會覺得這種樣式會更有用:

~/.screenrc
truecolor on
hardstatus off
hardstatus alwayslastline '%{#00ff00}[ %H ][%{#ffffff}%= %{7}%?%-Lw%?%{1;0}%{1}(%{15}%n%f%t%?(%u)%?%{1;0}%{1})%{7}%?%+Lw%? %=%{#00ff00}][ %{#00a5ff}%{6}%Y-%m-%d %{#ffffff}%{7}%0c%{#00ff00} ]'

頂部狀態欄:

~/.screenrc
hardstatus firstline 

關掉歡迎信息

[編輯 | 編輯原始碼]
~/.screenrc
startup_message off

將您的固定狀態行作為 urxvt|xterm|aterm 的動態窗口標題

[編輯 | 編輯原始碼]

這非常簡單,只需要將您現在的 hardstatus 行切換為 caption 行,並相應地編輯:

~/.screenrc
termcapinfo rxvt* 'hs:ts=\E]2;:fs=\007:ds=\E]2;\007'
hardstatus string "screen (%n: %t)"
caption always '%{= 7;0}%Y-%m-%d %c %-Lw%{+b 2;0}[%n %t]%{-}%+Lw%=%{-}'

這將會使您的終端模擬器的標題顯示為類似 screen (0 bash) 這種效果。選項 caption 提供日期、當前時間以及豐富您的 Screen 窗口。

使用 X 的滾動機制

[編輯 | 編輯原始碼]

要滾動 Screen 的緩衝區可以使用 Ctrl+a [。然而,這非常的不方便。要使用如 xterm 或者 Konsole 的滾動條,請添加以下內容 [1]

~/.screenrc
termcapinfo xterm*|rxvt*|kterm*|Eterm* ti@:te@

將現有的程序添加進 Screen 中

[編輯 | 編輯原始碼]

如果您在 Screen 外運行了一個程序,但是現在想將此放在 Screen 中運行,您可以使用 reptyr 來將當前的 TTY 重新分配進 Screen 中。

安裝 reptyr 軟件包。

獲得對應進程的 PID (您可以使用 ps ax 命令獲取)。現在只需要把對應的 PID 作為 reptyr 的參數即可將進程放入 Screen 中。

$ reptyr pid

為 Screen 設定一個單獨的 bash 提示符

[編輯 | 編輯原始碼]

如果您希望在 Screen 會話下另外有一個不同的 bash 提示符,在您的 .bashrc[2] 中添加以下內容:

if [ -z $STY ]
then
        PS1="YOUR REGULAR PROMPT"
else  
        PS1="YOUR SCREEN PROMPT"
fi

關掉視覺響鈴

[編輯 | 編輯原始碼]

通過如下設置,Screen 會使用聲音響鈴而不是視覺響鈴。

~/.screenrc
vbell off

去掉垂直和水平條

[編輯 | 編輯原始碼]

去掉垂直條:

$ ~/.screenrc
rendition so =00

要去掉水平條,需要將前景和背景設成默認(d)並顯示空白(" "):

~/.screenrc
caption string "%{03} "

如果這不起效,嘗試換作 caption string "%{00} "。要將默認 caption 設成黑白,請使用 caption string "%{00}%3n %t"

故障和修復

[編輯 | 編輯原始碼]

修復編輯器文本殘留問題

[編輯 | 編輯原始碼]

在屏幕中打開文本編輯器(如 nano),然後關閉它時,文本可能會在終端中保持可見。要解決這個問題,請執行以下操作:

~/.screenrc
altscreen on

修復窗口列表中名稱列僅顯示 "bash "的問題

[編輯 | 編輯原始碼]

這篇文章的某些內容需要擴充。

原因:應解釋一下此命令的作用。 (在 Talk:GNU Screen 中討論)

~/.screenrc 添加以下內容:

~/.screenrc
windowlist string "%4n %h%=%f"

另請參閱

[編輯 | 編輯原始碼]