Answers:
为了进一步扩展Ansgar所说的内容,以防万一您对gnu屏幕不太熟悉,在一个屏幕会话中拥有多个“窗口”可能会满足您的需要。
ctrl+ a,c将在您的活动屏幕会话中创建一个新的“窗口”。您可以在多个窗口之间切换用(如安斯加尔所示)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行,但是它是完全可定制的(请参见手册页或在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
希望能有所帮助。
马修
是的,screen
很可能是要走的路。Ctrl+ a,n将带您到下一个窗口Ctrl+ a,p到上一个窗口。Ctrl+ a,0.. 9将允许您切换到特定屏幕。
花费了很多时间后,我编写了一个脚本来解决此完全缺失的功能。首先,它需要一个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才能退出。
您可以使用简单的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
您将需要按ctrl+v
then选项卡,以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
瞧 与您分离的每个屏幕都将您带到下一个屏幕。
放映愉快!!
我编写了一个节点脚本,允许用户使用箭头键从列表中选择要附加的屏幕会话。我把它做成了npm软件包。您可以在此处查看它:screen-command。或者只是npm i -g screen-command
尝试一下,假设您已经安装了node.js。安装软件包后,使用命令sc
来召唤屏幕列表。
我希望这可以使您轻松切换到所需的确切屏幕。
^a
其他更改为其他字符,因此在bash中使用emacs样式的行编辑以及其他任何操作都不会令人讨厌。我用^t
。