GNU Screen - Arch Linux 中文维基

跳至內容

# GNU Screen

出自 Arch Linux 中文维基

相關文章

- Ratpoison
- Xpra
- tmux

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

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

翻譯狀態：

- 本文（或部分內容）譯自 GNU Screen，最近一次同步於 2026-8-01，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

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-line` 在 GNU Readline 和類 Bash 的 Shell 裡。

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

例如，如果您發現您很少使用 `Ctrl+j` 組合鍵在您的 Shell 和編輯器中，您就可以用 `escape ^Jj` 把轉義鍵設定為 `Ctrl+j`。第二個 「j」 表示，您可以通過依次按下 `Ctrl+j` 和 `j` 的按鍵序列，向終端發送一個原始的 `Ctrl+j` 信號。對於 Dvorak 鍵盤布局的用戶，`Ctrl+t`（`escape ^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 設定了 `$TERM` 為 `screen.$TERM`，儘管 這個手冊中描述的不一樣。即不需要修改它在 `~/.screenrc` 中。參見：

- 逐一運行 RGB 真彩色轉義序列參數索引
- tparm 的錯誤使用

(在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"

## 另請參閱

- Wikipedia:GNU Screen
- GNU Screen 用戶手冊
- Gentoo:Screen
- Arch Forums - 帶屏幕截圖的 .screenrc 配置
- Arch Forums - 關於 urxvt 的 256 色問題

分類：​

- 終端多路復用器
- GNU
- 使用「模板:Move」標記的頁面或章節
- 使用「模板:過時」標記的頁面或章節

GNU Screen
新增話題