开发者社区> 杨粼波> 正文

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

简介: 对于一个要使用彩色的程序员,就必须要使用类似 slang 或 ncurses 这样的的库,者通常会增加执行文件的大小。 Ncurses 有着或多或少的独立于终端的类型的优势
+关注继续查看

概述

在现实生活中,每一位 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 中设置颜色不仅仅能创建更加漂亮的提示符, 在编写控制台程序的时候也非常有用。

对于一个要使用彩色的程序员,就必须要使用类似 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 不是作为一个字符来处理的。  

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
[oeasy]python0110 屏幕点阵字体_3x5_5x7_雅达利字库
[oeasy]python0110 屏幕点阵字体_3x5_5x7_雅达利字库
19 0
[oeasy]python0082_VT100_演化_颜色设置_VT选项_基础色_高亮色_索引色_RGB总结
[oeasy]python0082_VT100_演化_颜色设置_VT选项_基础色_高亮色_索引色_RGB总结
16 0
[oeasy]python0074_设置高亮色_color_highlight_ansi_控制终端颜色
[oeasy]python0074_设置高亮色_color_highlight_ansi_控制终端颜色
11 0
运行可用:使用FreeType输出中文汉字点阵图形的源码
运行可用:使用FreeType输出中文汉字点阵图形的源码
19 0
矩形螺纹的宏程序编程参考
矩形螺纹的宏程序编程参考
92 0
147.VGA256色模式编程
147.VGA256色模式编程
13 0
Windows程序设计——GDI字符及图形标准输出标准输出
Windows程序设计——GDI字符及图形标准输出标准输出
84 0
InstallShield:卸载时文字叠加,文字乱码
原文:InstallShield:卸载时文字叠加,文字乱码 问题: InstallShield2010打包的程序。如果程序正在运行,卸载程序,提示关闭程序,然后消息界面出现文字叠加。 定位问题: 新建Installshield项目,依次修改SetupType,InstallShield,Dialog,发现修改Dialog/Skin后出现bug。
743 0
win10系统下如何用命令行的方式打开画图软件以及画图板汉字字体如何由竖排改为横排?
按 win + r 后输入命令 mspaint  再 回车 即可!如下图所示: 画图板正常默认的汉字排列是横排,但输入字体时选用不慎变为竖排,该怎样恢复为横排呢? 方法:字体名前不带@的,就是横排的,带@的就是竖排的。
1347 0
+关注
杨粼波
网游的老兵
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载