博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

PS1 Linux终端下的颜色设置

Posted on 2012-05-29 10:43  bw_0927  阅读(3154)  评论(0编辑  收藏  举报

http://zhainx.yo2.cn/articles/linux-terminal-under-the-color-settings.html

参考Nico Golde牛牛的文章发挥:

    在 ANSI 兼容终端(例如 xterm、rxvt、konsole 等)里, 可以用彩色显示文本而不仅仅是黑白。 本文示范了如何使用粗体和彩色的文字。

    相信每一位Linux使用者都要面对 Bash。 虽然第一眼看上去非常枯燥,但是又很多方法能够让你的 shell 足够的个性化。 shell 提示符的彩色增强让能够让你的 shell 独一无二, 而且还非常清晰易读。

在本文中我以 Bash shell 为例。因为在不同的终端里的转义序列不完全相同, 所以在本文中我使用的是 ANSI 终端。 

  shell 彩色配置出现在 bash 的个人配置文件 ~/.bashrc 或者是全局配置文件 /etc/bashrc 里面。 可以通过bashrc 里面的 PS1 变量来设置提示符的外观。

一般默认的情况下.bashrc里面应该是:

                 ~/.bashrc

                  export    PS1=' \u@\h:\w\$ '

                  上面的意思是:用户@主机:当前目录 $

                   -->这也是大家都非常熟悉的shell提示符 。

转义序列

要是通过彩色化提示符来增加个性化,就要用到转义序列。 转义序列就是一个让 shell 执行一个特殊步骤的控制指令。 转义序列通常都是以 ESC 开头(这也是它的命名原因)。 在 shell 里表示为 ^[ .这种表示法需要一点时间去适应, 也可以用 \033 完成相同的工作(ESC 的 ASCII 码用十进制表示就是 27,等于用八进制表示的 033)。

要直接在 shell 里面输入转义序列我们需要先按 ctrl-v:CTRL-v ESC 

下面进入主题,说下该如何用shell的颜色。我用我自己的shell颜色设置详细说明.

 linuxshellinfo

代码:

        PS1="\[\033[1;32;40m[\033[0;32;40m\u@\h:\033[1;35;40m\w\033[1;32;40m]\033[1;31;40m\$\033[1;32;40m \]"

最外边的"\[    \]"是为了把转义序列的字符串括起来,防止转义序列的文本显示在 shell 里占用太多的空间。

\033 声明了转义序列的开始,然后是 [ 开始定义颜色。 后面的 0 定义了默认的字体宽度,接着的中间的数字定义字符颜色。最后面的数字定义了字符背景色。字母m是定义本身所必须的,字母m后面的字符就是你想改变的字符了。

 可选颜色:红色、绿色、黄色、蓝色、洋红、青色和白色。 他们对应的颜色代码是:30(黑色)、31(红色)、32(绿色)、 33(黄色)、34(蓝色)、35(洋红)、36(青色)、37(白色)。

用同样色方法设置背景色,不过要把第一个数字“3”替换成“4”, 例如 40、41、42、43、44、45、46、47。

比如上面我的定义中: 最后显示的结果是在$号之前的字符全部用一个浅绿色的中括弧扩起来。$字符 显示为红色。后面的输入显示为高亮浅绿色。在括弧里面,用户名@主机显示为深绿色,路径显示为洋红。

用代码解释:

Ps1 ="\[                                                  -------------> 最外面的括弧

                 \033[1;32;40m[

                                               ----> 定义最右边的" [ " ;1:字体宽度,好像有加亮功能。

                                                                                              32:字符颜色。32表示绿色。

                                                                                              40:背景色,40表示黑色。

                \033[0;32;40m\u@\h:

                                                --------->定义右边的 \u@\h:  这几个字符颜色。

                                                                                            0: 默认字体宽度。

                                                                                             32:字符颜色。绿色。

                                                                                             40:  背景颜色。黑色。

                   \033[1;35;40m\w

                                                  ---------> 定义右边的 \w  (路径颜色) 。

                                                                                             1:字符宽度。加亮。

                                                                                             35:字符颜色。洋红。

                                                                                             40:背景色。黑色。

                     \033[1;32;40m]

                                                  ---------> 定义右边的  ]  字符。跟前面的   [   字符使用同一效果。

                     \033[1;31;40m\$

                                                   ---------> 定义了  $  字符 为红色。转义字符,所以前面加了 \ .

                                                                       颜色都跟前面差不多。相信大家都发现规律了。

                      \033[1;32;40m

                                                  ----------> 这个定义了你在命令行要输入命令显示的颜色。

                       \]"

                                                  -----------> 字符串结束括弧。

这个就是上面例子的详细定义内容。

其 实我的是没有关闭颜色转义序列,让自己输入的字符也改变颜色,整天看这黑白屏幕不爽哇!!如果不想改变输入颜色的话,用 \033[0m 关闭转义序列, \033[0m 是 shell 的默认颜色。按照上面的例子来说就是在 \]" 前面加上 \033[0m 即可。

够简单吧?

看看root下的shell:

rootshowG

这个也不错,是 Nico Golde的:

PS1="\[\033[0;37;44m\u@\033[0;32;43m\h:\033[0;33;41m\w$\033[0m\]"

 

nico@ ebrain: ~$

这里还有更多的颜色组合,是通过bash shell脚本实现的所有颜色组合。你可以挑选你自己喜欢的任意一种。

  colorforbash

 

文本属性

刚才提到了,在第一个转义序列后面的“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 

作者:zhainx

参考: http://www.linuxfocus.org/English/May2004/article335.shtml

最近读者:

Rand Posts:

, bash, color, linux, shell

find和xargs使用详解 关于google site

3 Responses to “Linux终端下的颜色设置”

补充看这里:

\u \h \W:这是一些转义字符,下面详细解释:

\d :代表日期,格式为weekday month date,例如:"Mon Aug 1"

\H :完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux

\h :仅取主机的第一个名字,如上例,则为fc4,.linux则被省略

\t :显示时间为24小时格式,如:HH:MM:SS

\T :显示时间为12小时格式

\A :显示时间为24小时格式:HH:MM

\u :当前用户的账号名称

\v :BASH的版本信息

\w :完整的工作目录名称。家目录会以 ~代替

\W :利用basename取得工作目录名称,所以只会列出最后一个目录

\# :下达的第几个命令

\$ :提示字符,如果是root时,提示符为:# ,普通用户则为:$

:新建一行

======================================

https://blog.csdn.net/qq_42876636/article/details/82960511

 

先举个例子:

#include <iostream>

int main()
{
  std::cout<<"\033[33mHello \033[34mworld!\033[0m"<<std::endl;
  return 0;
}

执行以上代码,你将会看到红色的Hello和蓝色的world!
观察上述代码,你会发现我用了三个\033[*m
这就是Linux输出彩色字体的关键
下表就是每个类似的字符串所代表的意思 (此表转自此处)
\033[0m 关闭所有属性
\033[1m 高亮
\033[2m 亮度减半
\033[3m 斜体
\033[4m 下划线
\033[5m 闪烁
\033[6m 快闪
\033[7m 反显
\033[8m 消隐
\033[9m 中间一道横线
10-19 关于字体的
21-29 基本与1-9正好相反
30-37 设置前景色
40-47 设置背景色
30:黑
31:红
32:绿
33:黄
34:蓝
35:紫
36:深
37:白
38 打开下划线,设置默认前景色
39 关闭下划线,设置默认前景色
40 黑色背景
41 红色背景
42 绿色背景
43 棕色背景
44 蓝色背景
45 品红背景
46 孔雀蓝背景
47 白色背景
48 不知道什么东西
49 设置默认背景色
50-89 没用
90-109 又是设置前景背景的,比之前的颜色浅
\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 显示光标

根据上表,就可以写一个函数,做到切换各种颜色
代码如下 (只支持一些常用的颜色)

//color.h
#ifndef SETCOLOR_H
#define SETCOLOR_H

const int F_BLACK = 0x01 // 000001
const int F_RED = 0x02 // 000010
const int F_GREEN = 0x03 // 000011
const int F_YELLOW = 0x04 // 000100
const int F_BLUE = 0x05 // 000101
const int F_DPURPLE = 0x06 // 000110
const int F_WHITE = 0x07 // 000111

const int B_BLACK = 0x08 // 001000
const int B_RED = 0x10 // 010000
const int B_GREEN = 0x18 // 011000
const int B_BROWN = 0x80 // 100000
const int B_BLUE = 0x88 // 101000
const int B_WHITE = 0x90 // 110000
//缺一个111000,但就这些了

bool setColor(int color); // color是一个前景色于一个后景色的位或结果
void resetFColor(); // 重置前景色
void resetBColor(); // 重置背景色

#endif // SETCOLOR_H

//color.cpp
#include "color.h"
#include <iostream>

bool setColor(int color)
{
bool ret = true;
int fore = color%8; //取color的后3位
int back = (color/8)*8; //将color的后3位清空 (即取前3位)
switch (fore)
{
case F_BLACK:std::cout<<"\033[30m";break;
case F_RED:std::cout<<"\033[31m";break;
case F_GREEN:std::cout<<"\033[32m";break;
case F_YELLOW:std::cout<<"\033[33m";break;
case F_BLUE:std::cout<<"\033[34m";break;
case F_PURPLE:std::cout<<"\033[35m";break;
case F_WHITE:std::cout<<"\033[37m";break;
default:ret = false;
}
switch (back)
{
case B_BLACK:std::cout<<"\033[40m";break;
case B_RED:std::cout<<"\033[41m";break;
case B_GREEN:std::cout<<"\033[42m";break;
case B_BROWN:std::cout<<"\033[43m";break;
case B_BLUE:std::cout<<"\033[44m";break;
case B_WHITE:std::cout<<"\033[47m";break;
default:ret = false;
}
return ret;
}
void resetFColor()
{std::cout<<"\033[39m";}
void resetBColor()
{std::cout<<"\033[49m";}

注:本段代码未经测试,可能会有错误,请谅解!

最后,我们来编译一下这个文件不会手动编译的朋友们注意了

使用指令$ sudo apt-get install gcc g++来安装C和C++ (没有用Ubuntu的朋友们百度找找C和C++的编译器吧)
进入那两个文件存放的目录
使用指令$ g++ -c -o test.o test.cpp来生成目标文件 (假设那两个文件名为test.h和test.cpp)
使用指令$ gcc -fPIC -shared test.o来生成动态链接库
使用指令$ ar rcs -o libtest.a test.so来生成静态库 (ar在安装gcc和g++时已经安装好)
如果你编辑好了main函数放在main.cpp里,则可以进行后两步
使用指令g++ -c -o main.o main.cpp生成目标文件
如果你使用动态链接库,使用指令gcc -o main -L. -ltest main.cpp生成main (libtest.so必须放在main的所在目录下,否则main.exe失效)
如果你使用静态库,使用指令gcc -o main main.o libtest.a生成main (libtest.a不一定一直放在main的所在目录下,因为main不依赖)