Chinaunix首页 | 论坛 | 博客
  • 博客访问: 543135
  • 博文数量: 104
  • 博客积分: 2089
  • 博客等级: 大尉
  • 技术积分: 1691
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-29 08:48
文章分类

全部博文(104)

文章存档

2015年(1)

2013年(13)

2012年(31)

2011年(59)

分类: LINUX

2012-11-14 20:38:47

在unix/linux的终端下,怎么控制终端输出的颜色和格式呢,当然了有专门的工具,tput,但是能被terminal直接读懂的格式化字符串更通用。
先来个实际的例子,在屏幕的最上部的右侧输出当前时间,一秒刷新一次。可能会想到使用类似Ncurse的框架完成,不过这有简单的遵守terminal控制格式的字符流规则,我们为什么不用呢。
  1. while true; do echo -ne "\e[s\e[0;$((COLUMNS-27))H$(date)\e[u"; sleep 1; done &
当然,有个tput的版本:
  1. while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-29));date;tput rc;done &
这里我写了个格式串的说明

点击(此处)折叠或打开

  1. 终端显示的带有ansi控制的字符串 := \(<控制单元>[字符串]\)\+
  2.   控制单元 := \(<起始标记><控制元素>\)\+<结束标记>
  3.   起始标记 := \e \| \x1b \| \033
  4.   结束标记 := m
  5.   字符串 := 要输入的字符
  6.     控制元素:= <元素起始标记>\[ 0 1 4 5 7 8 前景色;背景色 背景色;前景色 \|
  7.               光标相对位置控制 光标坐标 2J K s u ?25l ?25h \]
  8.     元素起始标记:=[
  9.       前景色 := 30-37 # 30:黑 31:红 32:绿 33:黄 34:蓝色 35:紫色 36:深绿 37:白色
  10.       背景色 := 40-47 # 40:黑 41:深红 42:绿 43:黄色 44:蓝色 45:紫色 46:深绿 47:白色
  11.       光标坐标 := y;xH # 不要忘记H
  12.       光标相对位置控制 := <n行><方向>
  13.          n行 := 整数
  14.          方向 := \[ A B C D \] #分别代表了向 上 下 右 左
  15.       0 := 关闭所有属性
  16.       1 := 设置高亮度
  17.       4 := 下划线
  18.       5 := 闪烁
  19.       7 := 反显
  20.       8 := 消隐
  21.       2J := 清屏
  22.       K := 清除从光标到行尾的内容
  23.       s := 保存光标位置
  24.       u := 恢复光标位置
  25.       ?25I := 隐藏光标
  26.       ?25H := 显示光标
这样解析下bash版本的字串 "\e[s\e[0;$((COLUMNS-27))H$(date)\e[u" 。
\e[s  :保存光标位置
\e[0;$((COLUMNS-27))H  在终端第一行的倒数27个字符的位置开始打印字符
$(date)  打印date命令的输出
[u 恢复光标位置

这样控制太爽了!!!
我写的这种格式看着不爽,参考这个
字背景颜色 字颜色 ANSI控制码的说明
40:黑 
41:深红 

42:绿 
43:黄色 
44:蓝色 
45:紫色 
46:深绿 
47:白色 
30:黑 
31:红 

32:绿 
33:黄 
34:蓝色 
35:紫色 
36:深绿 
37:白色 
033[0m 关闭所有属性 
\033[1m 设置高亮度 

\033[4m 下划线 
\033[5m 闪烁 
\033[7m 反显 
\033[8m 消隐 
\033[30m -- \33[37m 设置前景色 
\033[40m -- \33[47m 设置背景色 
\033[nA 光标上移n行 
\033[nB 光标下移n行 
\033[nC 光标右移n行 
\033[nD 光标左移n行 
\033[y;xH设置光标位置 
\033[2J 清屏 
\033[K 清除从光标到行尾的内容 
\033[s 保存光标位置 
\033[u 恢复光标位置 
\033[?25l 隐藏光标 
\033[?25h 显示光标

例子
输出白底红字的hellow word
#bash版 

  1. echo -e '\033[31;47;1mhello word\033[0m'
  2. 或者
  3. printf '\e[31;47;1mhello word\033[0m \n'
c 版本

  1. #include <stdio.h>

  2. int main(){

  3.     printf("\e[31;47;1mhello word\033[0m \n");
  4.     return 0;
  5. }
python版本
  1. print "\033[31;47;1mhello word\033[0m \n"
发现 python中\e 是不可以使用的。

在PS1中我们可以让提示更丰富多彩
例如我的PS1变量为

  1. PS1="\[\e]2 \u | \d \t | \H | \w\a\e[40;32;1m\]\h:\[\e[40;35;1m\]\W\[\e[40;33;1m\]\\$\[\e[0m\] "
如果在设置了PS1后,不能正确的计算自动换行,那么用'\['和'\]'吧转义序列括起来试试
ok了
遇到中文字符就悲剧了,把标题中含有中文字符的选项去掉就行了,这是我在ubuntu的中文环境下测试的

  1. PS1="\[\e]2 \u | \t | \H | \w \e[40;32;1m\]\h:\[\e[40;35;1m\]\W\[\e[40;33;1m\]\\$\[\e[0m\] "

参考
例子
介绍 http://blog.sina.com.cn/s/blog_704836f40101awsd.html
tpu 介绍 http://www.ibm.com/developerworks/cn/aix/library/au-learningtput/index.html 
很详细的 http://venus585625.iteye.com/blog/1174567 
阅读(2996) | 评论(2) | 转发(1) |
给主人留下些什么吧!~~

wwwkljoel2013-11-05 14:49:34

acikee:本机试验 \033[?25l 隐藏光标 最后一个字母是小写的l 不是大写I!

是的,验证是小写l。 谢谢

回复 | 举报

acikee2013-02-20 15:52:21

本机试验 \033[?25l 隐藏光标 最后一个字母是小写的l 不是大写I!