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


19

我想在一个腻子窗口中进行很少的虚拟会话,然后在它们之间快速切换。最好的方法是什么?screen?我知道我可以与之分离,ctrl+ad然后重新附加到另一个会话,但是似乎要打字很多。

Answers:


22

为了进一步扩展Ansgar所说的内容,以防万一您对gnu屏幕不太熟悉,在一个屏幕会话中拥有多个“窗口”可能会满足您的需要。

ctrl+ ac将在您的活动屏幕会话中创建一个新的“窗口”。您可以在多个窗口之间切换用(如安斯加尔所示)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行,但是它是完全可定制的(请参见手册页或在Google上搜索“ 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将允许您切换到特定屏幕。


您可以设置更快的键绑定,例如F11用于上一个,F12用于下一个窗口。并将屏幕转义字符从^a其他更改为其他字符,因此在bash中使用emacs样式的行编辑以及其他任何操作都不会令人讨厌。我用^t
彼得·科德斯

1

其他人说的是正确的。我只想提及tmux是的替代方法screen。他们有非常相似的命令。

双方screentmux提供运行的会话多个窗口,而这可能是你想要的。 tmux此外,还提供了多个会话之间的跳转(每个会话都有自己的窗口)。您很少需要它。

这里是一些屏幕文档的链接, 以及有关tmux的崩溃课程。


1

花费了很多时间后,我编写了一个脚本来解决此完全缺失的功能。首先,它需要一个fifo:

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

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

文件sc(在$ 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

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

当我们分离所有会话时,我们处于无限循环中,因此我们必须执行Ctrl-c才能退出。


1

您可以使用简单的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
    

您将需要按ctrl+vthen选项卡,以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. 瞧 与您分离的每个屏幕都将您带到下一个屏幕。

放映愉快!!


这是一个非常好的答案,它提高了该网站的整体质量。
123456789123456789123456789

1

我编写了一个节点脚本,允许用户使用箭头键从列表中选择要附加的屏幕会话。我把它做成了npm软件包。您可以在此处查看它:screen-command。或者只是npm i -g screen-command尝试一下,假设您已经安装了node.js。安装软件包后,使用命令sc来召唤屏幕列表。

我希望这可以使您轻松切换到所需的确切屏幕。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.