GNU屏幕生存指南

时间:2008-09-16 09:12:44

标签: gnu-screen

人们的想法不仅仅是你需要了解的关于优秀的屏幕实用程序的基本内容,还有你认为值得从头开始教某人,初学者的事情吗?

我刚刚向Screen介绍了一位朋友,他们很难适应它。因此,记住绑定等的类比和方便技巧会很棒。

19 个答案:

答案 0 :(得分:91)

我使用屏幕超过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以尝试解锁它。

答案 1 :(得分:36)

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

[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 ~]$

答案 2 :(得分:30)

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

答案 3 :(得分:26)

如果你的朋友习惯按下^A到bash的行开头,他/她会有一些惊喜,因为^A是屏幕命令键绑定。通常我最终得到一个冻结的屏幕,可能是因为我在^A之后按下了一些随机键:-)

在这些情况下,我尝试

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

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

答案 4 :(得分:12)

您可以将ctrl-A中的转义键重新映射为您选择的另一个键,因此如果您将其用于其他内容,例如要转到bash行的开头,你只需要在〜/ .screenrc文件中添加一行。要使它成为^ b或^ B使用:

escape ^bB

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

  screen -ls                lists your current screen sessions
  screen -S <name>          creates a new screen session called name
  screen -r <name>          connects to the named screen sessions

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

  ^A c          create a new shell
  ^A [0-9]      switch shell
  ^A k          kill the current shell
  ^A d          disconnect from screen
  ^A ?          show the help

可以找到一个出色的快速参考here。值得收藏。

答案 5 :(得分:8)

有些熟悉屏幕的提示,但是他们往往不记得他们在手册页中读到的内容:

  • 更改屏幕窗口的名称非常简单: ctrl + A shift + A
  • 你错过了屏幕上的最后一条消息吗? ctrl + a ctrl + m 会再次为您显示。
  • 如果您想运行某些内容(例如拖尾文件)并让屏幕告诉您何时发生更改,请使用 ctrl + A shift + m 。警告:如果任何更改,它会通知您。
  • 想直接选择窗口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 shift + 0到9

答案 6 :(得分:6)

ctrl + a 是一个特殊的密钥。

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

ctrl + a c [c]创建一个新窗口 ctrl + a 0-9 在数字窗口之间切换

screen -r - 返回分离会话

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

答案 7 :(得分:6)

Ctrl + A 是基本命令

Ctrl + A N =转到*** N *** ext屏幕

Ctrl + A P =转到*** P *** revious屏幕

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

Ctrl + A D = *** D *** etach your screen

答案 8 :(得分:6)

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

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

答案 9 :(得分:6)

我必须“添加”:添加

bind s

到你的.screenrc,如果你 - 像我一样 - 过去常常使用拆分窗口,因为C-a S会拆分实际窗口,但C-a s将其冻结。所以我只是禁用了冻结快捷方式。

答案 10 :(得分:4)

并不仅仅与屏幕有关,但是enabling 256 colors in my terminal, GNU Screen and Vim改善了我的屏幕体验(特别是因为我每天在Vim中编码约8小时 - 有一些非常适合眼睛的颜色方案)。

答案 11 :(得分:3)

默认情况下,在下一版本的Ubuntu Server中,有一些interesting work正在完成一个好的gnu屏幕设置,其中包括使用屏幕底部显示所有窗口以及其他有用的窗口机器详细信息(例如#可用更新以及机器是否需要重新启动)。您可以抓住他们的.screenrc并根据您的需要进行自定义。

.screenrc中最有用的命令如下

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

通过这种方式,我总是知道窗口是打开的,以及此刻它们正在运行的是什么。

答案 12 :(得分:3)

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

逃避`e

那是反击-E。

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

答案 13 :(得分:3)

我不记得我是谁(dotfile.org上有人)偷了这个。我为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 $*
}

它为上面的别名打开一个新屏幕,iff使用ssh,它用ssh主机名重命名屏幕标题。

干杯z0mbix

答案 14 :(得分:2)

我喜欢设置一个屏幕会话,其中包含窗口的描述性名称。 ^ a A将允许您为当前窗口命名,^ a“将为您提供窗口列表。 完成后,用^ a d分离屏幕并重新附加屏幕-R

答案 15 :(得分:2)

有人在Server Fault上发布了类似的问题。

答案 16 :(得分: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

附加:

在屏幕上工作时我觉得很方便的另一种打击方式:

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

通过这种方式,您可以使用少量击键来列出您的屏幕。我不知道sls是否与任何现有的实用程序发生冲突,但当时我的系统上没有,所以我去了它。

答案 17 :(得分:0)

^ A A切换回刚来的屏幕。

答案 18 :(得分:0)

^ A对于UNIX人来说是一个很棒的特殊字符,但如果你使用屏幕与OpenVMS交谈,那么^ A就无法过早地使你秃顶。在VMS中,如果你在从历史缓冲区执行之前编辑DCL命令,插入模式是关闭的(必须有几个原因我不会进入这里)..打开它所以你不要过 - 键入你的命令,而不是把事情搞定,你必须点击^ A