概述 本文以 Bash shell 為例。(不同的終端裡的逸出序列不完全相同). Shell 的配置 shell 彩色配置出現在 bash 的個人設定檔 ~/.bashrc 或者是全域設定檔 /etc/bashrc 裡面。 可以通過 bashrc 裡面的 PS1 變數來設定提示符的外觀。 例如:
PS1="/s-/v/$ " /s 表示 shell 的名稱,-/v 表示版本號碼。 在提示符的最後面放置了一個 $。 PS1="/u@/h /w /$ " |
表示 使用者@ 目前的目錄 $ 逸出序列 要是通過彩色化提示符來增加個人化,就要用到逸出序列。 逸出序列就是一個讓 shell 執行一個特殊步驟的控制指令。逸出序列通常都是以 ESC 開頭(這也是它的命名原因)。 在 shell 裡表示為 ^[。也可以用 /033 完成相同的工作(ESC 的 ASCII 碼用十進位表示就是 27, 用八進位表示為 33)。 要直接在 shell 裡面輸入逸出序列需要先按 ctrl-v:CTRL-v ESC。 使用 shell 的顏色 下面用一個提示符的例子來解釋 shell 的顏色。 PS1="/[/033[0;32;40m/u@/h:/w/$ /]" 這樣提示符就全部顯示成綠色了。就像這樣:
/033 聲明了逸出序列的開始,然後是 [ 開始定義顏色。 後面的 0 定義了預設的字型寬度。稍後我會介紹其他的可用字元。 逸出序列字串要用 /[ 和 /] 括起來, 防止逸出序列的文本顯示在 shell 裡佔用太多的空間。 下面要選擇前景色彩(這裡是 32,代表綠色)。背景色的 40 表示黑色。 要是不想讓提示符後面的文字也變成綠色,需要用 /033[0m 關閉逸出序列, /033[0m 是 shell 的預設顏色。前景色彩和背景色都有 8 種可用的選擇。 可選顏色:紅色、綠色、黃色、藍色、洋紅、青色和白色。 他們對應的顏色代碼是:30(黑色)、31(紅色)、32(綠色)、 33(黃色)、34(藍色)、35(洋紅)、36(青色)、37(白色)。 用同樣色方法設定背景色,不過要把第一個數字“3”替換成“4”, 例如 40、41、42、43、44、45、46、47。 樣本: PS1="/[/033[0;37;44m/u@/033[0;32;43m/h:/033[0;33;41m/w$/033[0m/]" 這給了非常多彩的提示符:
使用 export PS1="string" 來測試這些設定;PS1="/[/033[1;34;40m[/033[1;31;40m/u@/h:/w/033[1;34;40m]/033[1;37;40m $/033[0;37;0m/] "
文字屬性剛才提到了,在第一個逸出序列後面的“0”是提示符的文本的預設顏色設定。 對於文字屬性來說,有意義的值及對應關係為: 0、預設值 1、粗體 22、非粗體 4、底線 24、非底線 5、閃爍 25、非閃爍 7、反顯 27、非反顯 通過下面這一段短小的指令碼,可以看看色彩組合。 #!/bin/sh ############################################################ # Nico Golde <nico(at)ngolde.de> Homepage: http://www.ngolde.de # Last change: Mon Feb 16 16:24:41 CET 2004 ############################################################
for attr in 0 1 4 5 7 ; do echo "----------------------------------------------------------------" printf "ESC[%s;Foreground;Background - /n" $attr for fore in 30 31 32 33 34 35 36 37; do for back in 40 41 42 43 44 45 46 47; do printf '/033[%s;%s;%sm %02s;%02s ' $attr $fore $back $fore $back done printf '/n' done printf '/033[0m' done
另一個程式 在 shell 中設定顏色不僅僅能建立更加漂亮的提示符, 在編寫控制台程式的時候也非常有用。 對於一個要使用彩色的程式員,就必須要使用類似 slang 或 ncurses 這樣的的庫,者通常會增加執行檔案的大小。 Ncurses 有著或多或少的獨立於終端的類型的優勢。 C 語言樣本 用綠色列印“Hello Word”: #i nclude <stdio.h> int main(void){ const char *const green = "/033[0;40;32m"; const char *const normal = "/033[0m"; printf("%sHello World%s/n", green, normal); return 0; }
另外一個有用的逸出序列是 printf("/033[2J"),它和 system(clear) 完成的功能一樣。但是可以不需要標頭檔 unistd.h。 使用printf("/033[1K") 可以刪除一行。 初始化指令碼樣本 如果想在 /etc/init.d 的 init 指令碼成功的執行後, 得到一個漂亮的、清晰易讀的提示,而不是一個簡單的 '.', 可以再一次的使用逸出序列。 這是一段 cron init script 的摘錄: #!/bin/sh # Start/stop the cron daemon. test -f /usr/sbin/cron || exit 0
case "$1" in start) echo -n "Starting periodic command scheduler: cron" start-stop-daemon --start --quiet --exec /usr/sbin/cron
echo "." ;;
如果 cron 指令碼執行成功就會顯示一個句點。 可以用 [Ok] 給這些資訊添加上彩色特徵,通過改變 echo 字串,例如: #!/bin/sh # Start/stop the cron daemon. test -f /usr/sbin/cron || exit 0 case "$1" in start) echo -n "Starting periodic command scheduler: cron" start-stop-daemon --start --quiet --exec /usr/sbin/cron echo "/[ /033[1;34;40m[ /033[1;32;40mOk /033[1;34;40m]/033[0m/]" ;;
把這個設定應用到所有的 init指令碼上非常耗費時間, 除非使用逸出序列 /033 —— 因為 Ctrl-v 不是作為一個字元來處理的。 定製命令提示字元 我們可以定製要顯示的bash命令提示字元,包括目前使用者名和主機名稱,目前時間,平均負載和當前工作目錄。要實現該目的,修改$PS1變數,如下所示: bash> PS1='u@h:w @> ' bash> export PS1 root@medusa:/tmp 03:01 PM> 結果將會在命令列顯示當前登入的使用者名稱、主機名稱、當前工作目錄和目前時間。從使用者指南頁可以獲得bash可以理解的符號列表。 |