GNU的screen工具是一个很好的工具.如果需要经常或者大量的登录服务器进行操作,screen或许还是一个不可或缺的好工具.
本文主要想探讨的主要问题是screen的配置脚本中如何自由定制状态栏的内容.也即hardstatus的内容定制.
本文所讨论的问题,对于screen工具的使用来说,基本没有什么指导作用,甚至可以认为是一个很无聊的问题,所以如果你是想找如何入门使用screen的话,那么,没有必要继续往下看了,可以参考网上很多同志的其他的介绍文档.
对于使用putty来连接服务器的同志来说,一般而言,如果需要得到多个shell的方法有三种:
- 最直接也是最简单的,就是多开几个putyy连接终端.这是最普遍使用的一种方法吧.
- 本地安装X-window服务器.一般是Xming或者是Xwin Server.使用一个putty登录系统,然后使用xterm.可以打开”无限”个终端.
- 使用scrren工具,在每次putty登录时,最多能同时打开10个终端.
从上面的描述来看,screen没有体现出什么优势,主要原因是没有展开来说,具体的到网上一搜一大把screen如何如何好的文章,此点不是本文探讨重点,略去.
我想说的是,在使用screen工具的时候,她象图形化界面的程序一样,在窗口的最底端,能够显示一个status 栏或者caption栏.如下图所示:
此status bar能够用来显示很多的东西,内容可以自己定制.本文主要讨论如何自己来定制下面的这样一个hardstatus栏或者caption栏.
首先有一点需要说明,就是为什么需要caption栏或者是hardstatus栏.没有不行么?
没有完全行.有跟没有在使用上没有什么大的区别,有这一栏的话,反而占了一点显示的面积,使得显示的区域变小了.
那么,为什么还要呢?
主要是因为用起来有方便的地方.因为我们使用putty登录的的界面,跟我们登入了screen之后的界面,如果没有这一栏的话,显示是一样的.
这样就不方便我们判断我们到底是在putty的登录界面下呢?还是其实已经是在screen的控制下了呢?
如果我们在screen下工作的时候,有一个地方提醒一下”你现在是在screen下啦,CTL+A不要随便乱用了阿”,那改多好呢?
这就是我研究hardstatus栏的写法的目的,或者说是出发点也行.
到底怎么写呢?
主要是原来我自己也不是很清楚应该怎么弄,然后中文的各种介绍就是估计只是复制粘贴了一些现成的示例,所以导致认为设置hardstatus栏很难.
但是看了英文的原文的参考资料,就发现,其实没什么的.也蛮简单的,只是稍稍有一些麻烦.
比如说网上比较流行的一个配置是这样的:
caption always “%?%F%{-b 4w}%:%{-b bb}%? %H | %l | %m-%d %c |%?%F%{-b 4w}%?%L=%-Lw%45>%{-b w4}%n%f* %t%{-}%+Lw%-0<”
上面这一行鸟东西看起来还不把人眼睛看花了?脑子看坏掉了?
但是一般网上的介绍也就到此为止,往下继续讲的中文的帖子基本上就没有了.这也难怪,中国人的习惯是实用主义的,这个东西用处有限,有人已经整理好了,拿来用就行了,干嘛还要研究呢?
搜了搜英文的介绍,发现有不少介绍caption或者hardstatus的写法的.主要的依据还是screen自己的文档.现把文档中关于”string escape”部分的内容总结如下,这部分的内容主要就是解释如何写的语法的.
一般来说,参考下面的这两个表,什么样的hardstatus栏或者caption栏都能够写出来了,也不会被别人的语句给吓到了.:
% | 转义字符标记本身,所有的有特殊含义的标记都是以此%开始的. |
a | 字符”am”或者”pm” |
A | 字符”AM”或者”PM” |
C | 当前的时间HH:MM(24小时制) |
C | 当前的时间HH:MM(12小时制) |
d | 日期数字 |
D | 星期数字 |
F | Flags of the windows(未知其意) |
F | 表示当此窗口拥有焦点的时候,%?表达式值为真 |
h | 当前窗口的Hardstatus状态 |
H | 系统名,也就是hostname |
l | 当前的系统负载 |
M | 月份数字 |
M | 月份名字(Jan?) |
N | 窗口的编号(从0开始),如果是%3n这样的表达式表示窗口编号占3位 |
S | 时间表示中的秒数字 |
S | 秒名字 |
U | 在当前窗口上的所有的其他的用户 |
W | 所有的窗口的编号以及窗口的名字,如果是-w,则表示从0窗口到当前窗口之前的所有窗口,如果是+w表示当前窗口的下一个窗口到最后的所有窗口 |
W | 所有的窗口的编号以及名字,除了当前的窗口 |
y | 年份数字的最后的两位 |
Y | 年份的全称 |
? | 条件判断一般的表达式是%?xxxxx%?:yyyyy.如果xxxxx不是空字串的话,则显示xxxxx,否则显示yyyyy |
= | %=表示填充之前的字符串hardstatus栏的最右端,如果是%50=这种表达方式的话,则表示填充到hardstatus栏的50%处.注意填充的字符是空格.
也可以使用%+20=以及%-30=这样的表达式,这两个表达式分别表示从上一个填充的结束位置开始填充20%的空格, 然后显示之后的字串(如果之前不存在填充的话,则跟%20=没有任何的区别),以及填充空格到距离右边30%的地方. 关于这个,特别需要注意的地方就是,象”%n:%t%5=%H”这个表达式,很明显%n:%t的输出应该大于hardstatus栏长度的%5, 但是填充到%5,后面的%H就从栏长度的%5开始写起,所以会引起前面的内容被后面的内容所覆盖的情况.也就是所谓的截断 |
< | 这个转义符一般用在hardstatus的string的最后,起的作用主要跟下面的%>一样,
是用来进行滚动的,所起的作用是,如果显示的内容超过了hardstatus栏本身的长度,那么会将整个显示的内容往前滚动,确保最后的内容能够被显示, 很显然,这样的话,显示内容的最前面的一部分就被滚动到显示区域之外而不能显示了. 一般而言,不需要仔细的琢磨这个转义符的意义,它主要和下面的%>配合使用的.而且当和%>一起使用的时候,滚动的特性就 变掉了, 不再是单纯的%<那样的让最末尾总是能够显示,而是变成了%>式的,让特定的部分滚动到特定的比例处. 那为什么不只用%>而是要和%<结合起来用呢?主要是%>的定义是, 如果存在滚动的话,则改变滚动的属性为将特定的部分滚动到特定的比例处,但是如果不存在滚动,则%>不起作用,而%<的作用,就是提供了滚动属性. |
> | 这个是一个很有用的功能,举个例子来说,有一个非常好的配置是这样的:
hardstatus string “%-w%{= BW}%50>%n %t%{-}%+w%<” 其中有一个%50>,前面是%-w表示的是从0到当前窗口之前的窗口number加title. |
{xx} | 大括号中的内容是设置属性或者配置颜色之类的.具体的内容参见下面的一个新表 |
下面的一个表是关于属性的设置的,其实也就是文字的颜色相关的一些设置
{+} | 增加此属性 |
{-} | 减少此属性,单独用时,表示回复到上次属性改变之前的设置值 |
{!} | 反转现在的属性 |
{=} | 改变当前属性,应用此处指定的属性 |
d | 昏暗效果 |
u | 下划线 |
b | 黑体 |
r | 反转 |
s | 突出显示 |
B | 闪烁效果 |
k | 黑色 |
r | 红色 |
g | 绿色 |
y | 黄色 |
b | 蓝色 |
m | 品红 |
c | 蓝绿 |
w | 白色 |
d | 默认颜色 |
. | 不改变颜色 |
注意,颜色的设置有前景色和背景色之分,也就是字体的颜色和背景的颜色.
%{= bm},这样的表达式表达的是背景色被改为b,前景色被改为m.(就是这样的顺序),如果只指定一个颜色而非两个颜色的话,那么改变的是前景色,如果使用了!,那么改变的将是背景色.也可以使用’.’来表示不改变颜色,如%{= b.}表示改变背景色而不改变前景色 | |
几个例子: | |
%{+b r}表示设置背景色为黑体的红色.就是加重的红色 | |
%{= yd}表示设置背景色为黄色,前景色为默认色 | |
%{= y.}背景色设置为黄色,前景色不变 | |
上面的两个表应该已经很详细了,对于绝大多数的设置应该都没有问题了.
最后,有个示例.
我觉得比较好的一个就是:
hardstatus string “%-w%{= BW}%50>%n %t%{-}%+w%<”
上面的这个很简单,也很实用,没有多少什么系统负载信息之类的东东,只显示了系统中所有的窗口名并且高亮当前的窗口名.但我觉得这个是很好的了,简洁而实用.
效果图如下所示:
参考文档:
http://www.gnu.org/software/screen/manual/screen.html#Message-Line