Linux终端下如何实现彩色Shell输出
http://cn.tech.yahoo.com/050531/55/26zyr.html
对于兼容ANSI的终端,如xterm、rxvt、konsole等,可以彩色显示终端文本中的底色或前景颜色,本文将详细讨论如何实现随意修改和定制这些终端的颜色。
每个Linux用户几乎天天都会面对Bash,刚接触Linux的人总是感觉Bash过于沉闷单调,但是实际上每个用户都可以根据需要定制出自己喜欢的Shell,使它变得丰富多彩。例如,彩色提示符就可以使终端更酷,并且与众不同。
由于Linux中使用最广泛的Shell就是Bash,因此我们在这里主要讨论Bash,希望在其它不同Shell中定制色彩的可以参考Man。
配置Shell
设置颜色可以在Linux用户个人的Shell配置文件~/.bashrc中完成,或者在全局配置文件 /etc/bashrc中实现。这时候所有用户都会拥有一个一样的登录彩色Shell,其中提示符设置是由bashrc文件中的PS1变量来控制的,例如 可能是如下的格式:
~/.bashrc: PS1="s-v$ "
这里"s"表示Shell的名字,"v"表示Shell的版本号,在最后提示添加一个"$"美元符号。这样,当该用户登陆以后,得到的提示符就如下所示:
-bash-2.05b$
由于这样的提示符并不能提供足够的有意义信息,例如当前所在目录等,因此在绝大多数Linux发布中,提示符往往被设置为如下所示:
~/.bashrc: PS1="[u@h W $] "
这就是我们熟悉的[username@hostname current_dir $]的提示符模式。
转义序列符
为了添加个人风格的彩色提示符,我们需要使用转义序列符。一个转义序列符是一个控制命令,它控制Shell执行某个 特定的动作。一个转义序列符通常以 ESC开始,在Shell中被记录为"^[",有时候也被常常记录为3(因为ESC在ASCII编码中是27,八进制就被记录为033)。
为了直接在Shell中输入一个转义序列符,一般会以“Ctrl+V”作为前导,也就是“Ctrl-v ESC”。
使用Shell颜色
首先使用一个例子来说明如何实现Shell彩色:
PS1="[ 3[0;32;40mu@h:w$ 3[0m ]"
这时候就会显示如下的提示符:
在上面命令中,“3[0;32;40m”表示定义后面文本的颜色,“3”表示启动一个转义序列,“[”定义开始颜色 定义,“0”定义默认的字体颜色,其它部分稍后定义。“32”定义文本的前景色,这里32表示绿色;“40”定义文本的背景色,40表示黑色。在字符串的 最后定义了“ 3[0m”,它是用来恢复了默认的文本颜色设置,这样就只会得到一个彩色提示符,而不会影响命令和其输出的颜色显示(即黑底白字)。
我们一共有8种字体颜色可供选择,它们分别是30 (黑色)、31 (红色)、32 (绿色)、33 (黄色)、34 (蓝色)、35 ( 紫红色)、36 (青色)和37 (白色)。对于底色也有8种颜色可供选择,只需要将字体颜色的3修改为4即可,例如40、41、42、43、44、45、46、47。
例如,运行下面命令:
~/.bashrc: PS1="[3[0;37;44mu@3[0;32;43mh:3[0;33;41mw$3[0m]"
将显示如下彩色提示符:
或者
PS1="[3[1;34;40m[3[1;31;40mu@h:w3[1;34;40m]3[1;37;40m $3[0;37;0m] "
将显示如下彩色提示符:
文本属性
我们前面提到,转义序列符后面的“0”表示定义文本的颜色设置。除了颜色设置以外,还可以设置文本的其它属性。转义 序列符后可以跟以下数值:0、1、 22、4、24、25、7、27,分别定义颜色、黑体、非黑体、下画线、非下画线、闪烁、非闪烁、翻转、非翻转。通过下面的脚本我们可以看到所有的效果:
#!/bin/sh
############################################################
# Nico Golde
# 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 - " $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 '3[%s;%s;%sm %02s;%02s ' $attr $fore $back $fore $back
done
printf ' '
done
printf '3[0m'
done
在Shell环境下设置颜色的能力,不仅仅能够使得Shell提示符看上去更丰富多彩和吸引人,而且能有助于帮助基于console的Linux程序的互动性和趣味性。
来源:《开放系统世界》 作者:李翔
Linux 终端机下的彩色显示
(2001-04-27 15:20:29)
作者: Thorbjørn Ravn Andersen, ravn@dit.ou.dk
译者: Chou-Kai Wang, stylon@ms2.hinet.net
v1.4, 7 August 1997
--------------------------------------------------------------------------------
虽 然大部份的 Linux 发行版本都附有一个用来把目录的内容列出来,而且可以利用彩色来增强输出在视觉上的效果的'ls'指令,不过要把他设定的合你意 却不是件容易的事。这份文件说明了设定一些已经内附在你的 Linux 发行版本的软体,来达到这个目地的好几种不同的方法,还有在那□可以找到一些在大 部份版本的 Unix □都会用到,但是却常常不被附在 Slackware 或 RedHat Linux □的软体。这份文件的 HTML 版本也可 以在我的原始档案这□ http://www.mip.ou.dk/~ravn/colour-ls 找的到。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
1. 简介
这些年来彩色的显示器已经相当普遍,使用者也开始使用一些以彩色来表示例如:程式语言□的保留字,或是拼错的字,来给使用者一些视觉上的回馈。
自 从 Linux 的文字模式控制台支援彩色後,原来的 GNU ls 也很快的被修改成支援输出彩色的讯息而且被附在 Slackware 2.0 版 □。这些改良原来版本的缀补档案已经被整合到标准版的 GNU ls 里,现在也应该是所有新的 Linux 发行版本的一部份了。
现在这版本的文件是把最初的版本改写了许多部份後更新而来的,包括了一些关於 xterm 和 如何利用缀补档来更新核心的资讯。
这 份文件里的资讯都在 Redhat 4.1 □验证过,而且主要是在Slackware 2.0.2 版及核心版本 1.1.54 的环境□搜集而来的。 核心的缀补档的资讯是在 slackware 2.2.0,1.2.13 版的核心,并且以 tcsh 为预设的 shell的环境□取得的,而後来也在 2.0.27 的核心□验证过。如果你使用其它的设定或是 unix 版本,我会很感激你告诉我你的作业系统及版本,还有它是否支援彩色的显示。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
2. 快速入门:给没有那麽多耐心的读者
如果你有个 新版的 Linux,对你使用者目录下的这些档案作这些修改,下次你登入的时候就会生效了。
~/.bashrc:
alias ls="ls ‐‐color"
~/.cshrc:
alias ls 'ls ‐‐color'
这样就好啦!
你 也许还会想要作:``eval `dircolors $HOME/.colourrc`'',来设定你自己想要的颜色。这个档案可以用 ``dircolors -p >$HOME/.colourrc'' 来制造出来,而且□面有许多的注解方便你更改设定。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
3. 这样就好了吗?
首先你需要知道你使用的 ls 是不是可以适当的处理彩色输出。在 Linux 的文字模式控制台试试看这个指令(在 xterm □也可以):
% ls ‐‐color
(这□的 % 是 shell 的提示符号):
如果你看到了表示你的 ls 不能接受这个选项的错误讯息,那你应该安装新版本的 GNU fileutils 软体。如果你使用的发行版本没有提供新的升级软体,那麽就从 GNU 的映射站台取得这个软体并且直接从原始码安装。
如果你并没有看到错误讯息,那麽你使用的 ls 便可以接受这个选项。但很不幸的,有一些在 Slackware (其它的发行版本也有可能) □附的早期版本是有臭□的。在 Redhat 4.1 □面附的 3.13 版的 ls 就没有问题。
% ls ‐‐version
ls - GNU fileutils-3.13
如果你在 Linux 的文字模式终端机□执行 ``ls ‐‐ color'',那麽它的输出应该依照系统的预设值而有适当的彩色,而且你现在可以开始决定是不是需要改变任何的设定。
如 果你在 xterm □执行上面的过程,也许你还是没办法看到输出变成彩色。就跟 ls 一样,原来的 xterm 并不支援应用程式的彩色输出,而较新 的版本有支援。如果你的 xterm 不支援彩色,那麽请参考这个文件的结尾拿到较新版本的 xterm,同时你也只好切换到文字模式并且继续下面的步 骤。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
4. 有那些颜色可以选择呢?
下面的 shell 命令稿(感谢许多把 bash 的版本寄给我的人)显示出现在使用的主控台能够支援的各种颜色组合。如果没有颜色出现,那麽你的主控台就不支援 ANSI 的颜色选择。
#!/bin/bash
# 显示 ANSI 的彩色
#
esc="\033["
echo -n " _ _ _ _ _40 _ _ _ 41_ _ _ _42 _ _ _ 43"
echo "_ _ _ 44_ _ _ _45 _ _ _ 46_ _ _ _47 _"
for fore in 30 31 32 33 34 35 36 37; do
line1="$fore "
line2=" "
for back in 40 41 42 43 44 45 46 47; do
line1="${line1}${esc}${back};${fore}m Normal ${esc}0m"
line2="${line2}${esc}${back};${fore};1m Bold ${esc}0m"
done
echo -e "$line1\n$line2"
done
前景的颜色号码是在左边那一排,背景的则是在上方。如果你要粗体的字元和高亮度就在参数□加一个 "1",所以前景是白色而背景是蓝色就成了 "37;44;1"。整个的 ANSI 颜色选择序列就是
ESC [ 3 7 ; 4 4 ; 1 m
。
注: 背景不可以是高亮度,所以黄色(高亮度的棕色)只能用来作前景。这是硬体上的限制。
颜色代码:
0 - 黑色 4 - 蓝色 3# 是背景颜色
1 - 红色 5 - 粉红色 4# 是前景颜色
2 - 绿色 6 - 青色
3 - 黄色 7 - 白色 ;1 是粗体和高亮度
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
5. 如何设定 ls 的彩色输出
如果你想要修改 ls 内定的标准颜色,你需要用下面的指令在你的 HOME 目录下制造这一个档案
cd ; dircolors -p > .coloursrc
在你编辑完这个注解的很详细的档案以後,你必需要把它读进你的环境变数 LS_COLORS □,通常都是这样作的
eval `dircolors .colourrc`
然後你要把前面这一行放进你的 .bashrc 或 .cshrc 或 .tcshrc (依照你使用的 shell 而定)□。更详细的用法请看 dircolors(1) 的使用说明。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
6. 如何改变系统的预设值: 前景白色而背景是黑色
你需要告诉你的终端机驱动程式你想要的另一个预设值。要如何作并没有一个标准的方法,不过如果你是用 Linux 的话,你有 setterm 这个程式可以用。
"setterm" 使用终端机资料库□的资料来设定属性。要选择属性的话要这样作
setterm -foreground black -background white -store
"-store" 参数把现在所作的改变设定成预设值。这需要你现在使用的的终端机种类(在 TERM 环境变数□)在 termcap 资料库□有足够详细的纪录。如果 setterm 因为某种因素不能正常的工作,你还有其它的选择。
6.1 Xterm
你要有至少一种下列的 xterm,而且要支援彩色。
xterm -fg white -bg blue4
color_xterm -fg white -bg blue4
color-xterm -fg white -bg blue4
nxterm -fg white -bg blue4
这□的 'color_xterm' 支援彩色版的 'ls'。这□的颜色选择是模彷 SGI 上面使用的颜色。
6.2 虚拟主控台
你也可以修改核心,这样就可以一劳永逸的用控制码来改变虚拟主控台的预设值。如果你自己编译核心的话,我建议利用 kernel 的缀补档。
核心的原始码是在 /usr/src/linux/drivers/char/console.c ,大概在 1940 行,这是你应该修改的地方
def_color = 0x07; /* white */
ulcolor = 0x0f; /* bold white */
halfcolor = 0x08; /* grey */
def_color = 0x17; /* white */
ulcolor = 0x1f; /* bold white */
halfcolor = 0x18; /* grey */
这 边的十六进位数字是给显示卡用的: 最左边的位元(上面□例的 "1")是背景 ; 最右边的位元是前景。0 = 黑色,1 = 蓝色,2 = 绿色,3 = 青色, 4 = 红色, 5 = 紫色,6 = 棕色/黄色,7 = 白色。把数字加 8 可以得到高亮度的颜色。在大部份的情况下,高亮度的背景 色 == 闪烁的字加上普通的背景。由 sjlam1@mda023.cc.monash.edu.au 所提供
你也可以使用下面的 ANSI 控制码提供一个执行时期的主控台预设值。(在核心原始码□找到的)
ESC [ 8 ]
这个控制码把预设值设成目前的前景及背景颜色。然後重设属性的控制码(ESC [ m)让这预设值马上就取代黑白色成为使用中的颜色。
每次你重开机的时侯你都需要再把这些字串送给主控台。依照你的 Linux 主机用途不同,有好几个档案可以达成这个目的。
/etc/issue
在 Slackware □这就是 "Welcome to Linux xx.yy" 讯息所在的档案,如果你的主机是个人使用的话,从这个档案下手是不 错的选择(但对於用 telnet 远端登入使用系统的人就可能有点讨厌)。这个档案在每次开机的时侯都会被制造出来,原来的内容则被覆盖,所以你必需要 修改开机档案(在 Slackware □是 /etc/rc.d/rc.S,Redhat□是 /etc/rc.d/rc.local)□面的下列几 行:
echo ""> /etc/issue
echo Welcome to Linux `/bin/uname -a | /bin/cut -d\ -f3`. >> /etc/issue
改成
ESCAPE="在这□放入 ESC 码"
echo "${ESCAPE}[H${ESCAPE}[37;44m${ESCAPE}[8]${ESCAPE}[2J"> /etc/issue
echo Welcome to Linux `/bin/uname -a | /bin/cut -d\ -f3`. >> /etc/issue
这□ 的控制码会把游标归位、设定颜色(在这□的前景是白色而背景是蓝色)、把这个设定存起来并且把萤幕上其它部份清除掉。这□的改变会在下次重开机时生效。别 忘了在 emacs 要打入 ESC 字元要按 C-q 键而在 vi □要按 control-v,因为很显然的执行以上程式的 sh 并不了解 /033 这种用法。
/etc/profile 或 .profile
if [ "$TERM" = "console" ]; then
echo "\033[37;44m\033[8]" #
# 或使用 setterm。
setterm -foreground white -background blue -store
fi
/etc/login 或 .login
if ( "$TERM" == "console" ) then
echo "\033[37;44m\033[8]"
# 或使用 setterm。
setterm -foreground white -background blue -store
endif
[ 译者注: Linux 的主控台下的 $TERM 环境变数已经是 "linux" 而不是 "console" 了 ]
6.3 远端登入
你应该可以用上面示□过的 setterm 程式。当然,远端的机器必需要能够得到足够的资讯来操作你的终端机,而且你的终端机模拟程式要能够支援彩色。在我的经验□其它平台上最好的 vt100 终端机模拟程式有下列几种:
MS-DOS: MS-Kermit (免费, 不是 Microsoft 的产品)
Windows 95/NT: Kermit/95 (共享软体)
OS/2: Kermit/95 (共享软体)。 请注意标准的 telnet 支援彩色而且可以在本地端设定。
关於 kermit 的细节请看 http://www.columbia.edu/kermit/
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
7. 软体
以上所有的用法都假设你使用的是 GNU/Linux。如果你是使用其它的作业环境(比如说是执行 X 的 Sun 工作站等等)你还是可以拿到并且自己编译这些软体。
彩色版的 xterm 是从标准的 xterm 原始码而发展来的,而用来修改标准 xterm 的缀补档可以从任何一个 X11R6 的站台获得。听说 R6.3 内附的 xterm 有支援彩色,不过我没有测试过。
ftp://ftp.denet.dk/pub/X11/contrib/u...R6pl5-patch.gz
如果你是用旧版的 X 的话请看内附的文件。注意: 我自己并没有测试过!
'ls' 是内附在 GNU 的 fileutils 软体□而你可以从 prep.mit.edu 或其它的映射站台拿到。请拿最新的 3.13 版本。
ftp://ftp.denet.dk/pub/gnu/fileutils-3.XX.tar.gz
我自己曾经在 Solaris,SunOS,Irix 上成功编译过 color-ls。
我很欢迎对於这篇文章的回应。我的电子邮件地址是 ravn@dit.ou.dk
‐‐
Thorbjørn Ravn Andersen
--------------------------------------------------------------------------------
3 意見:
oFsv ghd
uLja nfl jerseys china
kUhm botas ugg baratas
6uViq ghd nz sale
8fUdw ghd sale uk
7zUyl ghd hair straighteners
lMvf cheap ugg boots
tEyc michael kors outlet
2pQoc GHD Australia
3xGxr burberry on sale
1hLhr bottes ugg
8sScn ghd nz sale
7zSdv louis vuitton sale
6uPjt michael kors handbags
4lQuf ghd hair straightener
8cLmt ugg sale
0xIlz wholesale nfl jerseys
9xOyk michael kors sale
2tBlz GHD Pas Cher
0tUhj cheap uggs
wGks ghd hair
tNyw cheap ugg boots
rTtu michael kors sale
5aZmv GHD
0vMug burberry purses
5sJad bottes ugg pas cher
4fUys ghd
7xYbh louis vuitton outlet
7cGma michael kors handbags
8oWli cheapest ghd straighteners
2nJgp ugg boots cheap
4tOly nike nfl jerseys
1oLdv michael kors handbags
2uCca styler ghd
5bLvi discount ugg boots
发表评论