我想在一个 Putty 窗口中设置几个虚拟会话,并在它们之间快速切换。最好的方法是什么??screen
我知道我可以断开连接ctrl+ad
,然后重新连接到不同的会话,但这似乎需要输入很多内容。
答案1
如果您对 gnu screen 不太熟悉,可以扩展一下 Ansgar 所说的内容,在单个 screen 会话中拥有多个“窗口”可能会满足您的需要。
ctrl+ a,c将在活动屏幕会话中创建一个新的“窗口”。您可以在多个窗口之间切换(如 Ansgar 所示),使用ctrl+ a,n切换至下一个窗口,使用ctrl+ a,p切换至上一个窗口。
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+ a,n将带您进入下一个窗口,Ctrl+ a,p带您进入上一个窗口。Ctrl+ a,0..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
假设您打开了几个屏幕。还假设您已将它们分类为工作和数据。
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; ...
申请后
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.
现在让我们使用隔离分离的屏幕
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)
现在让我们再次使用来选择您想要的(例如数据)
grep
。screen -ls | grep Detached | grep data
这将仅隔离数据屏幕。您可以使用正则表达式更改 grep 关键字以进行搜索,从而自定义搜索。
81592.data13 (Detached)
81586.data12 (Detached)
81574.data10 (Detached)
81580.data11 (Detached)
幸运的是,结果结构良好,并且以制表符分隔。现在让我们将列拆分为字段,并使用 选择第二个字段
cut
。screen -ls | grep Detached | grep data | cut -d' ' -f2
您需要按下Tab 键,在分隔符参数后ctrl+v
插入一个。结果应该是这样的。tab
-d
81592.data13
81586.data12
81574.data10
81580.data11
现在使用引号将其打包成命令
...
并像这样循环结果。在实际运行之前,请务必先检查制定的命令。我使用了echo screen -r
for s in `screen -ls | \ grep Detached | grep data | \ cut -d' ' -f2`; do \ echo screen -r $s; \ done
如果一切顺利,那么就尝试一下不用
echo
。for s in `screen -ls | \ grep Detached | grep data | \ cut -d' ' -f2`; do \ screen -r $s; \ done
瞧!您分离的每个屏幕都会带您进入下一个屏幕。
放映愉快!!