彩色的命令行 —— 使用 ANSI 色彩代碼

www.linuxfocus.org/ChineseGB/May2004/article335.shtml


摘要:

在 ANSI 兼容終端(例如 xterm、rxvt、konsole 等)裏, 可以用彩色顯示文本而不僅僅是黑白。 本文示範瞭如何使用粗體和彩色的文字

概述

在現實生活中,每一位 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\$ \]"
這樣提示符就全部顯示成綠色了。就像這樣:
nico@ebrain:~$

\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\]"

這給了我們一個非常多彩的提示符:
nico@ ebrain: ~$

我們使用 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\] "

[nico@ebrain:~ ]
 

文本屬性

剛纔提到了,在第一個轉義序列後面的“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 中設置顏色不僅僅能創建更加漂亮的提示符, 在編寫控制檯程序的時候也非常有用。

對於一個要使用彩色的程序員,就必須要使用類似 slangncurses 這樣的的庫,者通常會增加執行文件的大小。 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.dinit 腳本成功的執行後, 得到一個漂亮的、清晰易讀的提示,而不是一個簡單的 '.', 我們可以再一次的使用轉義序列。

這是一段 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 不是作爲一個字符來處理的。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章