在虚拟会话(屏幕?)之间快速切换

在虚拟会话(屏幕?)之间快速切换

我想在一个 Putty 窗口中设置几个虚拟会话,并在它们之间快速切换。最好的方法是什么??screen我知道我可以断开连接ctrl+ad,然后重新连接到不同的会话,但这似乎需要输入很多内容。

答案1

如果您对 gnu screen 不太熟悉,可以扩展一下 Ansgar 所说的内容,在单个 screen 会话中拥有多个“窗口”可能会满足您的需要。

ctrl+ ac将在活动屏幕会话中创建一个新的“窗口”。您可以在多个窗口之间切换(如 Ansgar 所示),使用ctrl+ an切换至下一个窗口,使用ctrl+ ap切换至上一个窗口。

ctrl+ a"将为您提供所有打开的窗口的列表。

使用这些简单的快捷方式,您可以非常快速、轻松地在不同的终端之间切换,无需使用多个屏幕会话即可实现您的目标。

如果您将以下行添加到 ~/.screenrc,它将始终显示您打开的窗口以及选择了哪个窗口,因此您不需要记住您所在的窗口。

hardstatus alwayslastline '%{= kg}[ %{G}%H %{g}][%= %{= kB}%?%-Lw%?%{+b r}(%{G}%n*%f %t%?(%u)%?%{r})%{-b B}%?%+Lw%?%?%= %{g}%]'

这是我喜欢使用的 hardstatus 行,但它是完全可定制的(参见手册页或在谷歌上搜索“gnu screen hardstatus”)。

您还可以用它做很多其他事情(例如,命名不同的打开的窗口),因此值得阅读一些教程。

以下是我通过快速搜索找到的一些内容:

http://news.softpedia.com/news/GNU-Screen-Tutorial-44274.shtml

http://www.ibm.com/developerworks/aix/library/au-gnu_screen/

当然最有用的是:

# From your terminal:
$ man screen

希望有所帮助。

马修

答案2

是的,screen这是最有可能的方法。Ctrl+ an将带您进入下一个窗口,Ctrl+ ap带您进入上一个窗口。Ctrl+ a0..9将允许您切换到特定的屏幕。

答案3

经过这么长时间,我编写了一个脚本来解决这个完全缺失的功能。首先它需要一个 fifo:

mkdir ~/.screen
mkfifo ~/.screen/pipe

该命名管道对于分离会话和“无屏幕主”会话之间的通信很有用。

文件陣容(在 $PATH 中):

#!/bin/bash
CONFIGFILE=~/.screen/"$1""rc"

if [ ! -r $CONFIGFILE ] ; then
   echo "Configurazione per $1 Assente" >&2
   exit 1
fi

exec 3<> ~/.screen/pipe

if [ "$STY" != "" ] ; then
   screen -d "$STY"
   echo "$1" >&3
else
   screen -r "$1" 2>/dev/null || screen -S "$1" -c $CONFIGFILE
   while true ; do
      read line <&3
      screen -r "$line" 2>/dev/null || screen -S "$line" -c ~/.screen/"$line""rc"
   done
fi

“CONFIGFILE” 的示例是:~/.screen/Monitorrc

layout new Monitor

screen -t "bash" bash --login
split -v
focus next
split 
focus bottom
screen -t "cv" sh -c "watch /usr/bin/cv -w"
split
focus bottom
screen -t "sys.log" sh -c "tail -F /var/log/sys.log"
focus up
focus up
resize 25
screen -t "top" sh -c "top"
focus left

结果是:当您想要启动屏幕类型时:

sc Monitor

或者你喜欢发明的另一个 sessionrc,我使用 Session Work 来做各种事情

例如:〜/ .screen / Workrc

layout new Work  
screen -t "bash" bash --login  

现在我们在会话监视器中,输入:

sc Work

会话监视器将自身分离并将“Work”写入命名管道。因此,第一个 sc 脚本继续前进并附加会话“Work”。
从会话监视器调用的 sc 关闭。

当我们分离所有会话时,我们陷入了无限循环,因此我们必须按 Ctrl-c 才能退出。

答案4

你可以用简单的 shell 脚本来做这件事,比如

    for s in `screen -ls | grep Detached | grep <regex to your screen names>`; do screen -r $s; done 
  1. 假设您打开了几个屏幕。还假设您已将它们分类为工作和数据。

    for i in {10..13}; do screen -S `printf data%02d $i`; done;
    for i in {0..5}; do screen -S `printf work%02d $i`; done;
    ...
    
  2. 申请后screen -ls,你的屏幕应该像这样

    There are screens on:
        81592.data13    (Detached)
        81539.work04    (Detached)
        81527.work02    (Detached)
        81586.data12    (Detached)
        81574.data10    (Detached)
        81533.work03    (Detached)
        81488.work00    (Detached)
        81607.ttys014.Mo    (Attached)
        81545.work05    (Detached)
        81580.data11    (Detached)
        81521.work01    (Detached)
        81515.work00    (Detached)
    12 Sockets in /var/folders/qs/cvlbhpr54fnb96vtx01bs9k00000gn/T/.screen.
    
  3. 现在让我们使用隔离分离的屏幕grep

    screen -ls | grep Detached
    

你应该得到类似这样的结果

        81592.data13    (Detached)
        81539.work04    (Detached)
        81527.work02    (Detached)
        81586.data12    (Detached)
        81574.data10    (Detached)
        81533.work03    (Detached)
        81488.work00    (Detached)
        81545.work05    (Detached)
        81580.data11    (Detached)
        81521.work01    (Detached)
        81515.work00    (Detached)
  1. 现在让我们再次使用来选择您想要的(例如数据)grep

    screen -ls | grep Detached | grep data
    

这将仅隔离数据屏幕。您可以使用正则表达式更改 grep 关键字以进行搜索,从而自定义搜索。

        81592.data13    (Detached)
        81586.data12    (Detached)
        81574.data10    (Detached)
        81580.data11    (Detached)
  1. 幸运的是,结果结构良好,并且以制表符分隔。现在让我们将列拆分为字段,并使用 选择第二个字段cut

    screen -ls | grep Detached | grep data | cut -d'       ' -f2
    

您需要按下Tab 键,在分隔符参数后ctrl+v插入一个。结果应该是这样的。tab-d

81592.data13
81586.data12
81574.data10
81580.data11
  1. 现在使用引号将其打包成命令...并像这样循环结果。在实际运行之前,请务必先检查制定的命令。我使用了echo screen -r

    for s in `screen -ls | \
    grep Detached | grep data | \
    cut -d'     ' -f2`; do \
        echo screen -r $s; \
    done
    
  2. 如果一切顺利,那么就尝试一下不用echo

    for s in `screen -ls | \
    grep Detached | grep data | \
    cut -d'     ' -f2`; do \
        screen -r $s; \
    done
    
  3. 瞧!您分离的每个屏幕都会带您进入下一个屏幕。

放映愉快!!

相关内容