摘要:
在 ANSI 兼容終端(例如 xterm、rxvt、konsole 等)里, 可以用彩色顯示文本而不僅僅是黑白。 本文示范了如何使用粗體和彩色的文字
參見:http://www.linuxfocus.org/ChineseGB/May2004/article335.shtml
概述
在現實生活中,每一位 Linux 使用者都要面對 Bash。 雖然第一眼看上去非常枯燥,但是又很多方法能夠讓你的 shell 足夠的個性化。 shell 提示符的彩色增強讓能夠讓你的 shell 獨一無二, 而且還非常清晰易讀。
在本文中我以 Bash shell 為例。因為在不同的終端里的轉義序列不完全相同, 所以在本文中我使用的是 ANSI 終端。
?Shell 的配置
shell 彩色配置出現在 bash 的個人配置文件
~/.bashrc 或者是全局配置文件
/etc/bashrc 里面。 可以通過
bashrc 里面的 PS1 變量來設置提示符的外觀。
通常情況下,這個條目看起來應該是這個樣子:
~/.bashrc: PS1="\s-\v\$ "
\s 表示 shell 的名稱,-\v 表示他的版本號。 在提示符的最后面我們放置了一個 $。這樣看起來也許有點乏味, 所以不妨試試下面這種模式——這種模式在大多數 Linux 的發行版本下是默認的設置: ~/.bashrc: PS1="\u@\h \w \$ "
|
這表示 用戶@ 當前目錄 $,這個是大部分 Linux 用戶都熟悉的 shell 提示符。
?轉義序列
要是通過彩色化提示符來增加個性化,就要用到轉義序列。 轉義序列就是一個讓 shell 執行一個特殊步驟的控制指令。 轉義序列通常都是以 ESC 開頭(這也是它的命名原因)。 在 shell 里表示為 ^[。這種表示法需要一點時間去適應, 也可以用 \033 完成相同的工作(ESC 的 ASCII 碼用十進制表示就是 27, = 用八進制表示的 33)。
要直接在 shell 里面輸入轉義序列我們需要先按 ctrl-v:
CTRL-v ESC。
?使用 shell 的顏色
下面我用一個提示符的例子來解釋 shell 的顏色。
~/.bashrc: 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。
示例:
~/.bashrc: PS1="\[\033[0;37;44m\u@\033[0;32;43m\h:\033[0;33;41m\w$\033[0m\]"
這給了我們一個非常多彩的提示符:
我們使用
export PS1="string" 來測試這些設置, 稍后我們要把這些設置轉移到
.bashrc 里面。 現在我的提示符看起來是這個樣子:
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
這段腳本可以從
showansicol.tar.gz 下載,格式是
tar.gz。
?另一個程序
在 shell 中設置顏色不僅僅能創建更加漂亮的提示符, 在編寫控制臺程序的時候也非常有用。
對于一個要使用彩色的程序員,就必須要使用類似
slang 或
ncurses 這樣的的庫,者通常會增加執行文件的大小。
Ncurses 有著或多或少的獨立于終端的類型的優勢。
?C 語言示例
用綠色打印“Hello Word”:
#include <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 不是作為一個字符來處理的。??