109

我刚刚向一位朋友介绍了GNU Screen,但他们很难适应它。这让我想到了他需要了解的有关出色的Screen实用程序的基本知识,以及您认为值得从头开始教某人(初学者)的事情。记住绑定等有哪些类比和方便的技巧?

这一定非常棒。

4

18 回答 18

96

我已经使用Screen了 10 多年,并且可能使用的功能不到一半。因此,绝对没有必要立即学习它的所有功能(我不建议尝试)。我的日常命令是:

^A ^W - window list, where am I
^A ^C - create new window
^A space - next window
^A p - previous window
^A ^A - switch to previous screen (toggle)
^A [0-9] - go to window [0-9]
^A esc - copy mode, which I use for scrollback

我想就是这样。我有时会使用分屏功能,但肯定不是每天都使用。另一个提示是,如果屏幕似乎已锁定,因为您不小心按了一些随机组合键,请同时执行这两项操作^Q^A ^Q尝试将其解锁。

于 2008-09-16T09:39:03.983 回答
38

直到我找到一种方法来在屏幕底部设置一个“状态栏”,以显示您所在的“标签”或“虚拟屏幕”以及还有哪些其他屏幕,我才习惯于屏幕。这是我的设置:

[roel@roel ~]$ cat .screenrc
# Here comes the pain...
caption always "%{=b dw}:%{-b dw}:%{=b dk}[ %{-b dw}%{-b dg}$USER%{-b dw}@%{-b dg}%H %{=b dk}] [ %= %?%{-b dg}%-Lw%?%{+b dk}(%{+b dw}%n:%t%{+b dk})%?(%u)%?%{-b dw}%?%{-b dg}%+Lw%? %{=b dk}]%{-b dw}:%{+b dw}:"

backtick 2 5 5 $HOME/scripts/meminfo
hardstatus alwayslastline "%{+b dw}:%{-b dw}:%{+b dk}[%{-b dg} %0C:%s%a %{=b dk}]-[   %{-b dw}Load%{+b dk}:%{-b dg}%l %{+b dk}] [%{-b dg}%2`%{+b dk}] %=[ %{-b dg}%1`%{=b dk} ]%{-b dw}:%{+b dw}:%<"

sorendition "-b dw"
[roel@roel ~]$ cat ~/scripts/meminfo
#!/bin/sh
RAM=`cat /proc/meminfo | grep "MemFree" | awk -F" " '{print $2}'`
SWAP=`cat /proc/meminfo | grep "SwapFree" | awk -F" " '{print $2}'`
echo -n "${RAM}kb/ram ${SWAP}kb/swap"
[roel@roel ~]$
于 2008-09-16T10:01:04.290 回答
30

Ctrl+ A? - 显示帮助屏幕!

于 2008-09-16T09:45:25.853 回答
26

如果您的朋友习惯于^A在 Bash 中按到行首,那么他/她会遇到一些惊喜,因为^A屏幕命令键绑定。通常我最终会出现冻结的屏幕,可能是因为我按下了一些随机键^A:-)

在这些情况下,我尝试

^A s^A q阻止/取消阻止终端滚动

解决这个问题。要转到屏幕内一行的开头,键序列是^A a

于 2008-09-16T09:23:31.460 回答
12

您可以将转义键从Ctrl+重新映射A为您选择的另一个键,因此如果您确实将它用于其他用途,例如转到 bash 中的行首,您只需在 ~/. screenrc 文件。要使其成为 ^b 或 ^B,请使用:

escape ^bB

在命令行中,使用名称会话来控制多个会话。我每个任务使用一个会话,每个会话都有多个选项卡:

  screen -ls # 列出你当前的屏幕会话
  screen -S <name> # 创建一个名为 name 的新屏幕会话
  screen -r <name> # 连接到指定的屏幕会话

使用 screen 时,您只需要几个命令:

  ^A c 创建一个新的外壳
  ^A [0-9] 切换外壳
  ^A k 杀死当前shell
  ^A d 与屏幕断开连接
  ^一个?显示帮助

可以在此处找到出色的快速参考。值得收藏。

于 2008-09-16T10:20:25.863 回答
8

对于那些有点熟悉屏幕但往往不记得他们在手册页中阅读的内容的人的一些提示:

  • 更改屏幕窗口的名称非常简单:ctrl++ 。A shiftA
  • 你错过了屏幕上的最后一条消息吗?ctrl++a ctrlm再次为您显示。
  • 如果你想运行一些东西(比如拖尾文件)并让屏幕告诉你什么时候有变化,在目标窗口上使用ctrl++ 。警告:如果有任何变化,它会通知您。A shiftm
  • 要直接选择窗口 15?.screenrc在您的文件中尝试这些:
bind  ! select 11
bind  @ select 12
bind \# select 13
bind  $ select 14
bind  % select 15
bind \^ select 16
bind  & select 17
bind  * select 18
bind  ( select 19
bind  ) select 10

这为 Windows 10 到 19分配了ctrl++ 。a shift0 through 9

于 2009-08-06T02:27:43.037 回答
7

Ctrl+A是基本命令

Ctrl+ A N= 转到***N***下一个屏幕

Ctrl+ A P= 转到***P***上一个屏幕

Ctrl+ A C= ***C***创建新屏幕

Ctrl+ A D= ***D***连接你的屏幕

于 2008-09-16T09:33:17.070 回答
6

Ctrl+a是一个特殊的键。

Ctrl+ a d- [d]etach,将程序(irssi?)留在后台,回家。

Ctrl+ a c[c]创建一个新窗口 Ctrl+a 0-9按编号在窗口之间切换

screen -r - 回到分离的会话

这涵盖了 90% 的用例。不要试图一次显示所有功能。

于 2008-09-16T09:28:46.783 回答
6

http://www.debian-administration.org/articles/34

几年前我写过这个,但它仍然是一个很好的介绍,得到了很多积极的反馈。

于 2008-09-22T19:45:11.813 回答
6

我“必须”添加这个:添加

bind s

到你的.screenrc,如果你 - 像我一样 - 曾经使用拆分窗口,C-a S拆分实际窗口,但C-a s冻结它。所以我只是禁用了冻结快捷方式。

于 2008-10-01T11:21:49.457 回答
4

不仅与屏幕相关,而且在我的终端中启用 256 种颜色并不是真正重要的,GNU Screen 和 Vim极大地改善了我的屏幕体验(特别是因为我每天大约 8 小时在 Vim 中编码 - 有一些非常适合眼睛的配色方案)。

于 2008-09-19T22:33:45.660 回答
3

在 Ubuntu Server 的下一个版本中,在默认情况下获得良好的 GNU 屏幕设置方面正在进行一些有趣的工作,其中包括使用屏幕底部显示所有窗口以及其他有用的机器详细信息(如更新次数可用以及机器是否需要重新启动)。您可能可以抓住他们.screenrc并根据您的需要对其进行自定义。

我的最有用的命令.screenrc如下:

shelltitle "$ |bash" # Make screen assign window titles automatically
hardstatus alwayslastline "%w" # Show all window titles at bottom line of term

通过这种方式,我总能知道哪些窗口是打开的,以及目前在其中运行的是什么。

于 2009-02-19T03:47:10.750 回答
3

我对 .screenrc 所做的第一个修改是更改转义命令。与你们中的许多人不同,我不喜欢默认的 Ctrl-A 序列,因为它在几乎所有其他上下文中都会干扰该基本功能。在我的 .screenrc 文件中,我添加:

逃脱`e

那是反引号-e。

这使我能够使用反引号作为转义键(例如,要创建一个新屏幕,我按反引号-c,分离是反引号-d,反引号-?是帮助,反引号-反引号是前一个屏幕,等等)。它干扰的唯一方法(我不得不改掉这个习惯)是在命令行上使用反引号来捕获执行输出,或者粘贴任何包含反引号的内容。对于前者,我通过使用 BASH $(command) 约定修改了我的习惯。对于后者,我通常只是弹出另一个 xterm 或从屏幕分离,然后粘贴包含反引号的内容。最后,如果我想插入文字反引号,我只需按反引号-e。

于 2009-05-21T17:34:30.887 回答
3

我将以下内容用于ssh

#!/bin/sh
# scr - Runs a command in a fresh screen
#
# Get the current directory and the name of command

wd=`pwd`
cmd=$1
shift

# We can tell if we are running inside screen by looking
# for the STY environment variable.  If it is not set we
# only need to run the command, but if it is set then
# we need to use screen.

if [ -z "$STY" ]; then
        $cmd $*
else
        # Screen needs to change directory so that
        # relative file names are resolved correctly.
        screen -X chdir $wd

        # Ask screen to run the command
        if [ $cmd == "ssh" ]; then
                screen -X screen -t ""${1##*@}"" $cmd $*
        else
                screen -X screen -t "$cmd $*" $cmd $*
        fi
fi

然后我设置以下 bash 别名:

vim() {
        scr vim $*
}

man() {
        scr man $*
}

info() {
        scr info $*
}

watch() {
        scr watch $*
}

ssh() {
        scr ssh $*
}

它为上述别名打开一个新屏幕,如果使用 ssh,它会使用 ssh 主机名重命名屏幕标题。

于 2009-11-05T13:27:47.750 回答
2

我喜欢为窗口设置一个带有描述性名称的屏幕会话。^a A 将让您为当前窗口命名,而 ^a " 将为您提供窗口列表。完成后,使用 ^ad 分离屏幕并使用 screen -R 重新附加

于 2008-09-22T19:35:52.583 回答
1

我喜欢用来screen -d -RR自动创建/附加到给定的屏幕。我创建了 bash 函数以使其更容易......

function mkscreen
{
    local add=n

    if [ "$1" == '-a' ]; then
        add=y
        shift;
    fi

    local name=$1;
    shift;
    local command="$*";

    if [ -z "$name" -o -z "$command" ]; then
        echo 'Usage: mkscreen [ -a ] name command

    -a          Add to .bashrc.' 1>&2;
        return 1;
    fi

    if [ $add == y ]; then
        echo "mkscreen $name $command" >> $HOME/.bashrc;
    fi

    alias $name="/usr/bin/screen -d -RR -S $name $command";

    return 0;
}

function rmscreen
{
    local delete=n

    if [ "$1" == '-d' ]; then
        delete=y
        shift;
    fi

    local name=$1;

    if [ -z "$name" ]; then
        echo 'Usage: rmscreen [ -d ] name

    -d          Delete from .bashrc.' 1>&2;
        return 1;
    fi

    if [ $delete == y ]; then
        sed -i -r "/^mkscreen $name .*/d" $HOME/.bashrc;
    fi

    unalias $name;

    return 0;
}

他们为/usr/bin/screen -d -RR -S $name $command. 例如,我喜欢在屏幕会话中使用 irssi,所以在我的 .bashrc 中(在这些函数下面),我有:

mkscreen irc /usr/bin/irssi

然后我可以输入irc终端进入 irssi。如果屏幕 'irc' 还不存在,则创建它并从它运行 /usr/bin/irssi(当然,它会自动连接)。如果它已经在运行,那么我只需重新附加到它,强制分离已经附加到它的任何其他实例。这很不错。

另一个例子是当我遇到 perldocs 时为它们创建临时屏幕别名:

mkscreen perlipc perldoc perlipc
perlipc # Start reading the perldoc, ^A d to detach.
...
# Later, when I'm done reading it, or at least finished
# with the alias, I remove it.
rmscreen perlipc 

-a 选项(必须是第一个参数)将屏幕别名附加到 .bashrc (因此它是持久的)并 -d 将其删除(这些可能具有破坏性,因此使用风险自负)。xD

附加:

另一个我在使用 screen 时发现很方便的 bash 主义:

alias sls='/usr/bin/screen -ls'

这样你就可以用更少的击键列出你的屏幕。我不知道是否sls与任何现有的实用程序发生冲突,但当时我的系统上没有,所以我去了。

于 2011-01-10T21:13:34.337 回答
0

^AA 切换回您刚刚来自的屏幕。

于 2008-09-16T10:31:37.680 回答
0

Ctrl+A对于 Unix 人来说是一个很棒的特殊字符,但是如果你使用 screen 与OpenVMS对话,那么不能 ^A 会让你过早地秃顶。

VMS中,如果您在从历史缓冲区执行之前编辑DCL命令,则插入模式处于关闭状态(由于某些原因,我不会进入这里)...打开它,这样您就不用'不要过度输入你的命令而不是空格,你必须点击`^A。

于 2013-03-07T23:19:45.770 回答