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
添加话题