【问题标题】:What must I know to use GNU Screen properly? [closed]我必须知道什么才能正确使用 GNU Screen? [关闭]
【发布时间】:2008-09-16 09:12:43
【问题描述】:

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

这会很棒。

【问题讨论】:

标签: gnu-screen


【解决方案1】:

我已经使用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 来尝试解锁它。

【讨论】:

  • ^A k 应添加到列表中以关闭窗口。
  • 我不使用 ^A k 因为可能会意外杀死超出我的预期。相反,我只是使用^D(或exit)在窗口中退出shell。屏幕窗口在退出窗口中的最后一个 shell 后自动关闭。
  • "^A esc - 复制模式,我用它来回滚"先生,你是男人中的神。
  • ^A [ 做同样的事情。
  • 感谢 ^A ^D 技巧...我被卡住了,无法回到我的会话。万一这对某人有帮助,我不久前写了一篇文章,解释了像这里这样的屏幕的基本知识,但还有一些技巧geekpad.ca/blog/post/…
【解决方案2】:

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

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

【讨论】:

  • 查看 byobu(屏幕配置文件):launchpad.net/byobu
  • 这太棒了,谢谢。当我试图拆分终端时,我一直在努力弄清楚到底发生了什么。我没有意识到我需要先运行 screen 才能使这些命令中的任何一个工作,我知道这很傻。
【解决方案3】:

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

【讨论】:

  • 我完全同意这一点。这比其他答案有用得多,因为您可以通过它扣除其他命令,但反之亦然。记住这件事也容易得多。
【解决方案4】:

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

在这些情况下我会尝试

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

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

【讨论】:

  • 将转义字符从 ^A 更改为其他字符很容易。我已将详细信息放在我的答案中。
  • @agnul +1 for you for ^A a 我是普通 bash 会话中 ^A 的用户,我不能在屏幕会话中使用它。感谢您的精彩提示! :)
  • 感谢你 100 次告诉我如何让 ctrl A 在屏幕内工作。我一生都在寻找这个。
  • 这里的“A”和“a”区分大小写吗?
  • 感谢行键序列的开头!超级有帮助。
【解决方案5】:

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

escape ^bB

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

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

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

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

可以在here 找到一个极好的快速参考。值得收藏。

【讨论】:

  • 我使用嵌套屏幕会话。我用screen -e^oo 开始外层,所以我可以使用Ctrl+O,然后用screen -m 开始内层,这样他们就会开始新的会话。
  • 您可以随时更改转义键。在正在运行的屏幕会话中,键入 ^A :,然后键入 \Bb,然后按 Enter 将转义键设置为 ^B。一般来说,^A : 可以让你评估你的.screenrc 理解的命令。
【解决方案6】:

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

  • 更改屏幕窗口的名称非常简单: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

【讨论】:

    【解决方案7】:

    Ctrl+A 是基本命令

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

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

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

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

    【讨论】:

      【解决方案8】:

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

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

      【讨论】:

      • 链接已(有效)损坏:$VAR1 = \'Can\'t connect to local MySQL server through socket \'/var/run/mysqld/mysqld.sock\' (111 "Connection refused") at ../lib/Singleton/DBI.pm line 95. ';
      【解决方案9】:

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

      bind s
      

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

      【讨论】:

      • ^-Q 解冻如果你点击^-S
      • 你是对的@Plato。我仍然在与用户一起工作的环境中,他们几乎不会记住任何快捷方式......我需要禁用它。
      • NP 我只是先找到了这个帖子并搜索了“冻结”并没有找到我要找的东西
      【解决方案10】:

      Ctrl+a 是特殊键。

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

      Ctrl+a c [c]新建一个窗口 Ctrl+a 0-9按数字切换窗口

      screen -r - 回到分离的会话

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

      【讨论】:

      • 虽然,当我第一次了解screen 时,我对它实际上 意味着分离重新附加 一个屏幕。 Quote :“...您可以在给定计算机上的单独控制台中长时间运行任务(例如远程计算机上的 ssh、IRC 会话……),从会话中分离,从一个物理位置移动到另一个物理位置,通过 ssh 连接到机器并重新连接到屏幕会话以继续工作。”
      【解决方案11】:

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

      【讨论】:

      • 谢谢!这困扰了我一段时间。
      【解决方案12】:

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

      转义`e

      这是反引号。

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

      【讨论】:

      • 太棒了。我一直使用反引号,即使我知道我应该使用 $(...),所以现在我想我可能不得不改变我的方式。反引号有点碍事,但最好有一个不需要修饰符的键。但是为什么是“e”,你是怎么记住的?
      • 我刚刚测试了 'escape ``',它工作得很好,似乎更容易记住。如果您点击反引号但没有得到您所期望的,请再次点击。
      • 我已经这样做了,但是有没有办法在屏幕上实际键入反引号?有时,有必要这样做,我讨厌不得不分离来做这件事......
      • @Guillouchon:前面的评论完全解释了这一点。
      【解决方案13】:

      有一些interesting work 在默认情况下在 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
      

      这样我总能知道哪些窗口是打开的,以及此刻正在其中运行什么。

      【讨论】:

        【解决方案14】:

        我将以下内容用于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 主机名重命名屏幕标题。

        【讨论】:

          【解决方案15】:

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

          重新附加

          【讨论】:

            【解决方案16】:

            我喜欢使用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

            追加:

            另一个我在大量使用屏幕时发现很方便的 bash 主义:

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

            这样您就可以用更少的按键来列出您的屏幕。我不知道sls 是否与任何现有的实用程序冲突,但当时我的系统上没有,所以我选择了它。

            【讨论】:

              【解决方案17】:

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

              【讨论】:

              • ^A ^A 切换回来,^A A 允许重命名窗口的标题。
              【解决方案18】:

              Ctrl + A 对于 Unix 人来说是一个很棒的特殊字符,但是如果您使用 screen 与 OpenVMS 交谈,则无法 ^A会让你过早秃顶。

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

              【讨论】:

              • 出于类似原因,我使用screen -e ^Ll;我根本无法忘记在 Emacs 中键入 ctrl-A 以转到行首。幸运的是,ctrl-L 是我很少需要的按键,而且恕我直言,它与它的一般含义(重绘/清除屏幕)很好地联系在一起。
              • @tripleee:我的.screenrcescape ^@^@,它使用空字符而不是control-A。在大多数系统上,您可以输入空字符作为控制空间,这很容易输入。 (我在主会话的一个窗口中运行了一个嵌套屏幕会话;对于那个我有escape ^]^]。)
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-11-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-04-21
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多