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. 在%-w顯示完了之後再添加一個%n %t.也就是說把本視窗的number和title也顯示出來. 但是在中間就插了一個這樣的%50>.這表示什麼呢? 因為,我們可能建立了很多的window,以至於光%-w的顯示已經超出了整個hardstatus的範圍, 那麼,當我們再顯示%n %t的時候,就超出了整個bar的顯示範圍, 也就需要進行截斷了.%50>所起的作用其實是一個滾動hardsatus欄的作用. 想象一下就能夠明白了,當hardstatus欄已經被%-w填滿了, 但是還要再繼續顯示%n %t,那麼%n %t就已經在顯示範圍之外了,看不見了. 這時候,我們應用%50>將%-w滾動到hardstatus欄50%的地方. 顯然,%-w的最前面的部分有一部分被截掉了.但是從%50開始顯示%n %t. 明白了吧,這個符號的作用,文字很難描述,但是視覺上,很容易懂的.就是滾動harstatus欄的作用.就是滾動而已. 可以使用如%50L>這樣的運算式,這表示, 如果存在滾動,則如果有內容因為滾動而未被顯示,那麼以…來表示有內容未顯示.左邊右邊均有可能有此顯示 |
| {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