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
来恢复。
从窗口 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
.