[PHP]在bash中输出彩色文本

先看图吧:

PHP在bash中输出彩色文本

乱不乱?这是我自己用的一个web游戏机器人程序的输出,游戏自然一切都是数字说了算,可每次看这一大堆数字实在是让我头疼,从中找出有用的数据太难了,对齐、缩进都办法也不怎么见效,突然我想到,如果用escape color输出彩色的文本,应该看起来会舒服很多吧?

说到escape color,用过bash的人应该都见过,只是不知道它叫这么名字而已。ls中彩色的文件、目录名就是用escape color来实现的。早些年用得比较多的telnet形式的bbs,它的颜色也是escape color,最明显的特征就是bbs文章被转贴到别处的时候,经常会多出一些ESC什么的字符出来,这就是escape color的控制字符。

想完整的了解escape color,资料很多,[wikipedia – ANSI escape code](http://en.wikipedia.org/wiki/ANSI_escape_code)就有比较完整的解释,中文的资料也不少,比如[啦啦~在bash下输出彩色的文本](http://www.fedorachina.cn/index.php/topic,124.0.html),甚至还有人做出了颜色表:[The 256 color mode of xterm](http://www.frexx.de/xterm-256-notes/)。

不用觉得眼花缭乱,简单说来,escape code就是在终端(terminal)中输出的控制字符,不光包括文字颜色,还可以控制很多其它内容,当然,颜色是比较常用的,所以习惯称之为escape color。我在这里也只讲颜色,其它控制字符的使用方式大同小异,但需要主意不同的终端类型可能会略有区别。

escape color的格式为:

<ESC>[{attr};{fg};{bg}m

其中<ESC>[是起始字符,在bash中一般是16进制的0x1b,也就是八进制的033,十进制的27,另外一种表现方式就是^[,熟悉吧,在bash中按一下Ctrl+v再按ESC它就出来了。后面分别是attr模式、fg前景色、bg背景色,中间用逗号;间隔,最后用字母m结尾。

attr的取值有:

0   Reset All Attributes (return to normal mode) #重置所有设置,回归自然
1   Bright (Usually turns on BOLD) # 高亮/加粗
2   Dim
3   Underline
5   Blink
7   Reverse
8   Hidden

fg的取值有:

30  Black
31  Red
32  Green
33  Yellow
34  Blue
35  Magenta
36  Cyan
37  White

bg的取值有:

40  Black
41  Red
42  Green
43  Yellow
44  Blue
45  Magenta
46  Cyan
47  White

可以看到,attr/fg/bg的用值范围不重叠,所以空缺哪个无所谓。

在用php输出的时候,只需要在正常字符串内容中,加入适当的escape color代码就可以了,其实其它应用程序也是类似操作的,并不需要额外的设置,比如:

$ php -r 'echo "\x1b[5;31;44m第一种色彩\x1b[3;34;41m第二种色彩\x1b[0m 回归自然\n";'

看到彩色了吧?秀一下我那个机器人美化之后的界面:

PHP在bash中输出彩色文本

顺便说一句,把字符串储存到文件中的时候,escape color也可以一起存上的,浏览时,cat和tail默认就支持颜色显示,less则需要带上-R参数才行。

3 thoughts on “[PHP]在bash中输出彩色文本”

  1. 看到你的文章,我把cvs 命令输出的颜色给改了. 现在看着是很清除 挺好的了.

    可惜有个不爽的地方, 我重定向到文件的时候它把esc color的代码也写到文件里了 导致我用vim看很难看….

    不知道阁下是不是有什么好方法没有.

Leave a Reply

Your email address will not be published. Required fields are marked *