如何在Linux中更改echo的输出颜色

遇到的问题:

我正在尝试使用echo命令在终端中打印文本。

我想用红色打印文本。 我怎样才能做到这一点?

解决方案:

解决方案一

您可以使用以下ANSI转义码

 Black        0;30     Dark Gray     1;30
Red          0;31     Light Red     1;31
Green        0;32     Light Green   1;32
Brown/Orange 0;33     Yellow        1;33
Blue         0;34     Light Blue    1;34
Purple       0;35     Light Purple  1;35
Cyan         0;36     Light Cyan    1;36
Light Gray   0;37     White         1;37 

然后在脚本中像这样使用它们:

 #    .---------- constant part!
#    vvvv vvvv-- the code from above
RED='\033[0;31m'
NC='\033[0m' # No Color
printf "I ${RED}love${NC} Stack Overflow\n" 

用红色印出love

根据@ james-lim的注释, 如果使用的是echo命令,请确保使用-e标志以允许反斜杠转义

 # Continued from above example
echo -e "I ${RED}love${NC} Stack Overflow" 

(除非要添加其他空行,否则在使用echo时请勿添加"\n"

解决方案二

您可以使用很棒的tput命令(在Ignacio的答案中建议)来为各种事物产生终端控制代码。


用法

稍后将讨论特定的tput子命令。

直接

调用tput作为命令序列的一部分:

 tput setaf 1; echo "this is red text" 

使用; 而不是&&因此如果tput错误仍然显示文本。

外壳变量

另一种选择是使用外壳变量:

 red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
echo "${red}red text ${green}green text${reset}" 

tput产生的字符序列被终端解释为具有特殊含义。 他们不会自己显示。 请注意,它们仍然可以保存到文件中,也可以由终端以外的程序作为输入进行处理。

命令替换

使用命令替换tput的输出直接插入echo字符串中可能会更方便:

 echo "$(tput setaf 1)Red text $(tput setab 7)and white background$(tput sgr 0)" 

上面的命令在Ubuntu上生成:

彩色终端文本的屏幕截图


前景和背景颜色命令

 tput setab [1-7] # Set the background colour using ANSI escape
tput setaf [1-7] # Set the foreground colour using ANSI escape 

颜色如下:

 Num  Colour    #define         R G B

0    black     COLOR_BLACK     0,0,0
1    red       COLOR_RED       1,0,0
2    green     COLOR_GREEN     0,1,0
3    yellow    COLOR_YELLOW    1,1,0
4    blue      COLOR_BLUE      0,0,1
5    magenta   COLOR_MAGENTA   1,0,1
6    cyan      COLOR_CYAN      0,1,1
7    white     COLOR_WHITE     1,1,1 

还有颜色设置功能的非ANSI版本( setb代替setabsetf代替setaf ),它们使用不同的数字,此处未给出。

文字模式命令

 tput bold    # Select bold mode
tput dim     # Select dim (half-bright) mode
tput smul    # Enable underline mode
tput rmul    # Disable underline mode
tput rev     # Turn on reverse video mode
tput smso    # Enter standout (bold) mode
tput rmso    # Exit standout mode 

光标移动命令

 tput cup Y X # Move cursor to screen postion X,Y (top left is 0,0)
tput cuf N   # Move N characters forward (right)
tput cub N   # Move N characters back (left)
tput cuu N   # Move N lines up
tput ll      # Move to last line, first column (if no cup)
tput sc      # Save the cursor position
tput rc      # Restore the cursor position
tput lines   # Output the number of lines of the terminal
tput cols    # Output the number of columns of the terminal 

清除并插入命令

 tput ech N   # Erase N characters
tput clear   # Clear screen and move the cursor to 0,0
tput el 1    # Clear to beginning of line
tput el      # Clear to end of line
tput ed      # Clear to end of screen
tput ich N   # Insert N characters (moves rest of line forward!)
tput il N    # Insert N lines 

其他命令

 tput sgr0    # Reset text format to the terminal's default
tput bel     # Play a bell 

使用compiz摆动窗口时bel命令会使终端摆动一秒钟,以引起用户的注意。


剧本

tput接受每行包含一个命令的脚本,这些脚本按顺序在tput退出之前执行。

通过回显多行字符串并将其用管道传递来避免使用临时文件:

 echo -e "setf 7\nsetb 1" | tput -S  # set fg white and bg red 

也可以看看

  • man 1 tput
  • 有关完整的命令列表和这些选项的更多详细信息,请参见man 5 terminfo (相应的tput命令在Cap-name 81行开始的巨大表的Cap-name列中列出。)

解决方案三

您可以使用一些变量:

 # Reset
Color_Off='\033[0m'       # Text Reset

# Regular Colors
Black='\033[0;30m'        # Black
Red='\033[0;31m'          # Red
Green='\033[0;32m'        # Green
Yellow='\033[0;33m'       # Yellow
Blue='\033[0;34m'         # Blue
Purple='\033[0;35m'       # Purple
Cyan='\033[0;36m'         # Cyan
White='\033[0;37m'        # White

# Bold
BBlack='\033[1;30m'       # Black
BRed='\033[1;31m'         # Red
BGreen='\033[1;32m'       # Green
BYellow='\033[1;33m'      # Yellow
BBlue='\033[1;34m'        # Blue
BPurple='\033[1;35m'      # Purple
BCyan='\033[1;36m'        # Cyan
BWhite='\033[1;37m'       # White

# Underline
UBlack='\033[4;30m'       # Black
URed='\033[4;31m'         # Red
UGreen='\033[4;32m'       # Green
UYellow='\033[4;33m'      # Yellow
UBlue='\033[4;34m'        # Blue
UPurple='\033[4;35m'      # Purple
UCyan='\033[4;36m'        # Cyan
UWhite='\033[4;37m'       # White

# Background
On_Black='\033[40m'       # Black
On_Red='\033[41m'         # Red
On_Green='\033[42m'       # Green
On_Yellow='\033[43m'      # Yellow
On_Blue='\033[44m'        # Blue
On_Purple='\033[45m'      # Purple
On_Cyan='\033[46m'        # Cyan
On_White='\033[47m'       # White

# High Intensity
IBlack='\033[0;90m'       # Black
IRed='\033[0;91m'         # Red
IGreen='\033[0;92m'       # Green
IYellow='\033[0;93m'      # Yellow
IBlue='\033[0;94m'        # Blue
IPurple='\033[0;95m'      # Purple
ICyan='\033[0;96m'        # Cyan
IWhite='\033[0;97m'       # White

# Bold High Intensity
BIBlack='\033[1;90m'      # Black
BIRed='\033[1;91m'        # Red
BIGreen='\033[1;92m'      # Green
BIYellow='\033[1;93m'     # Yellow
BIBlue='\033[1;94m'       # Blue
BIPurple='\033[1;95m'     # Purple
BICyan='\033[1;96m'       # Cyan
BIWhite='\033[1;97m'      # White

# High Intensity backgrounds
On_IBlack='\033[0;100m'   # Black
On_IRed='\033[0;101m'     # Red
On_IGreen='\033[0;102m'   # Green
On_IYellow='\033[0;103m'  # Yellow
On_IBlue='\033[0;104m'    # Blue
On_IPurple='\033[0;105m'  # Purple
On_ICyan='\033[0;106m'    # Cyan
On_IWhite='\033[0;107m'   # White 

bashhexoctal的转义字符分别为:

 |       | bash  | hex    | octal   | NOTE                         |
|-------+-------+--------+---------+------------------------------|
| start | \e    | \x1b   | \033    |                              |
| start | \E    | \x1B   | -       | x cannot be capital          |
| end   | \e[0m | \x1m0m | \033[0m |                              |
| end   | \e[m  | \x1b[m | \033[m  | 0 is appended if you omit it |
|       |       |        |         |                              | 

简短的例子:

 | color       | bash         | hex            | octal          | NOTE                                  |
|-------------+--------------+----------------+----------------+---------------------------------------|
| start green | \e[32m<text> | \x1b[32m<text> | \033[32m<text> | m is NOT optional                     |
| reset       | <text>\e[0m  | <text>\1xb[0m  | <text>\033[om  | o is optional (do it as best practice |
|             |              |                |                |                                       | 

bash例外:

如果您打算在特殊的bash变量中使用这些代码

  • PS0
  • PS1
  • PS2(=用于提示)
  • PS4

您应该添加额外的转义字符,以便可以正确解释它们。 如果没有添加额外的转义字符,它就可以工作,但是当您使用Ctrl + r在历史记录中进行搜索时,您将遇到问题。

bash例外规则

您应该在任何开始的ANSI代码之前添加\[ ,在任何结束的ANSI代码之后添加\]
例:
正常使用: \033[32mThis is in green\033[0m
对于PS0 / 1/2/4: \[\033[32m\]This is in green\[\033[m\]

\[用于表示一系列不可打印的字符
\]用于不可打印字符序列的结尾

提示:要记住,您可以先添加\[\] ,然后将ANSI代码放在它们之间:
- \[start-ANSI-code\]
- \[end-ANSI-code\]

颜色序列的类型:

  1. 3/4位
  2. 8位
  3. 24位

在深入研究这些颜色之前,您应该了解以下代码的4种模式:

1.颜色模式

它修改了非文本颜色的样式。 例如,使颜色变亮或变暗。

  • 0重置
  • 1; 比正常轻
  • 2; 比正常暗

此模式不受广泛支持。 它完全支持Gnome终端。

2.文字模式

此模式用于修改文本的样式,而不是颜色。

  • 3; 斜体
  • 4; 强调
  • 5; 闪烁(慢)
  • 6; 闪烁(快速)
  • 7; 相反
  • 8; 隐藏
  • 9; 划掉

并且几乎得到支持。
例如,KDE-Konsole支持5; 但是Gnome终端不支持,而Gnome支持8; 但是KDE不会。

3.前台模式

此模式用于给前景着色。

4.后台模式

此模式用于给背景着色。

下表总结了ANSI-color的3/4位版本

 |------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
| color-mode | octal    | hex     | bash  | description      | example (= in octal)         | NOTE                                 |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|          0 | \033[0m  | \x1b[0m | \e[0m | reset any affect | echo -e "\033[0m"            | 0m equals to m                       |
|          1 | \033[1m  |         |       | light (= bright) | echo -e "\033[1m####\033[m"  | -                                    |
|          2 | \033[2m  |         |       | dark (= fade)    | echo -e "\033[2m####\033[m"  | -                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|  text-mode | ~        |         |       | ~                | ~                            | ~                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|          3 | \033[3m  |         |       | italic           | echo -e "\033[3m####\033[m"  |                                      |
|          4 | \033[4m  |         |       | underline        | echo -e "\033[4m####\033[m"  |                                      |
|          5 | \033[5m  |         |       | blink (slow)     | echo -e "\033[3m####\033[m"  |                                      |
|          6 | \033[6m  |         |       | blink (fast)     | ?                            | not wildly support                   |
|          7 | \003[7m  |         |       | reverse          | echo -e "\033[7m####\033[m"  | it affects the background/foreground |
|          8 | \033[8m  |         |       | hide             | echo -e "\033[8m####\033[m"  | it affects the background/foreground |
|          9 | \033[9m  |         |       | cross            | echo -e "\033[9m####\033[m"  |                                      |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
| foreground | ~        |         |       | ~                | ~                            | ~                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         30 | \033[30m |         |       | black            | echo -e "\033[30m####\033[m" |                                      |
|         31 | \033[31m |         |       | red              | echo -e "\033[31m####\033[m" |                                      |
|         32 | \033[32m |         |       | green            | echo -e "\033[32m####\033[m" |                                      |
|         33 | \033[32m |         |       | yellow           | echo -e "\033[33m####\033[m" |                                      |
|         34 | \033[32m |         |       | blue             | echo -e "\033[34m####\033[m" |                                      |
|         35 | \033[32m |         |       | purple           | echo -e "\033[35m####\033[m" | real name: magenta = reddish-purple  |
|         36 | \033[32m |         |       | cyan             | echo -e "\033[36m####\033[m" |                                      |
|         37 | \033[32m |         |       | white            | echo -e "\033[37m####\033[m" |                                      |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         38 | 8/24     |                    This is for special use of 8-bit or 24-bit                                            |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
| background | ~        |         |       | ~                | ~                            | ~                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         40 | \033[40m |         |       | black            | echo -e "\033[40m####\033[m" |                                      |
|         41 | \033[41m |         |       | red              | echo -e "\033[41m####\033[m" |                                      |
|         42 | \033[42m |         |       | green            | echo -e "\033[42m####\033[m" |                                      |
|         43 | \033[43m |         |       | yellow           | echo -e "\033[43m####\033[m" |                                      |
|         44 | \033[44m |         |       | blue             | echo -e "\033[44m####\033[m" |                                      |
|         45 | \033[45m |         |       | purple           | echo -e "\033[45m####\033[m" | real name: magenta = reddish-purple  |
|         46 | \033[46m |         |       | cyan             | echo -e "\033[46m####\033[m" |                                      |
|         47 | \033[47m |         |       | white            | echo -e "\033[47m####\033[m" |                                      |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         48 | 8/24     |                    This is for special use of 8-bit or 24-bit                                            |                                                                                       |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------| 

下表总结了ANSI-color的8位版本

 |------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
| foreground | octal     | hex       | bash    | description      | example                            | NOTE                    |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
|        0-7 | \033[38;5 | \x1b[38;5 | \e[38;5 | standard. normal | echo -e '\033[38;5;1m####\033[m'   |                         |
|       8-15 |           |           |         | standard. light  | echo -e '\033[38;5;9m####\033[m'   |                         |
|     16-231 |           |           |         | more resolution  | echo -e '\033[38;5;45m####\033[m'  | has no specific pattern |
|    232-255 |           |           |         |                  | echo -e '\033[38;5;242m####\033[m' | from black to white     |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
| foreground | octal     | hex       | bash    | description      | example                            | NOTE                    |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
|        0-7 |           |           |         | standard. normal | echo -e '\033[48;5;1m####\033[m'   |                         |
|       8-15 |           |           |         | standard. light  | echo -e '\033[48;5;9m####\033[m'   |                         |
|     16-231 |           |           |         | more resolution  | echo -e '\033[48;5;45m####\033[m'  |                         |
|    232-255 |           |           |         |                  | echo -e '\033[48;5;242m####\033[m' | from black to white     |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------| 

8位快速测试:
for code in {0..255}; do echo -e "\e[38;05;${code}m $code: Test"; done

下表总结了ANSI-color的24位版本

 |------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
| foreground | octal     | hex       | bash    | description | example                                  | NOTE            |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
|      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | R = red     | echo -e '\033[38;2;255;0;02m####\033[m'  | R=255, G=0, B=0 |
|      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | G = green   | echo -e '\033[38;2;;0;255;02m####\033[m' | R=0, G=255, B=0 |
|      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | B = blue    | echo -e '\033[38;2;0;0;2552m####\033[m'  | R=0, G=0, B=255 |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
| background | octal     | hex       | bash    | description | example                                  | NOTE            |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
|      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | R = red     | echo -e '\033[48;2;255;0;02m####\033[m'  | R=255, G=0, B=0 |
|      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | G = green   | echo -e '\033[48;2;;0;255;02m####\033[m' | R=0, G=255, B=0 |
|      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | B = blue    | echo -e '\033[48;2;0;0;2552m####\033[m'  | R=0, G=0, B=255 |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------| 

一些屏幕截图

.gif前景8位摘要

前景色.gif

.gif背景8位摘要

background.gif

颜色摘要及其值

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

在KDE终端上blinking

KDE闪烁

一个简单的C代码,向您展示更多

cecho_screenshot

我开发的用于处理这些颜色的更高级的工具:

line


彩色模式拍摄

褪色-正常-亮

文字模式拍摄

纯文本模式

合并还可以

结合

更多的镜头


面向高级用户和程序员的提示和技巧:

我们可以在编程语言中使用这些代码吗?

是的你可以。 我对

它们会降低程序速度吗?

我想不是。

我们可以在Windows上使用它们吗?

3/4位是,如果您使用gcc编译代码
Win-7上的一些屏幕截图

如何计算代码长度?

\033[ = 2,其他部分1

我们在哪里可以使用这些代码?

任何有tty解释器的地方
xtermgnome-terminalkde-terminalmysql-client-CLI等。
例如,如果要使用mysql着色输出,可以使用Perl

 #!/usr/bin/perl -n
print "\033[1m\033[31m$1\033[36m$2\033[32m$3\033[33m$4\033[m" while /([|+-]+)|([0-9]+)|([a-zA-Z_]+)|([^\w])/g; 

将此代码存储在文件名: pcc (= Perl Colorize Character)中,然后将文件a放入有效的PATH然后在您喜欢的任何地方使用它。

ls | pcc
df | pcc

mysql内部,首先为pager注册它,然后尝试:

 [user2:db2] pager pcc
PAGER set to 'pcc'
[user2:db2] select * from table-name; 

个人电脑

它不处理Unicode。

这些代码仅进行着色吗?

不,他们可以做很多有趣的事情。 尝试:

 echo -e '\033[2K'  # clear the screen and do not move the position 

要么:

 echo -e '\033[2J\033[u' # clear the screen and reset the position 

有很多初学者想用system( "clear" )来清除屏幕,因此您可以使用它代替system(3)调用

它们可以使用Unicode吗?

是。 \u001b

这些颜色的哪个版本更好?

使用3/4-bit很容易,但是使用24-bit则非常准确和美观。
如果您没有使用经验,那么这里有一个快速教程:
24位表示: 000000000000000000000000 每个8位用于特定颜色。
1..8用于 9..16用于 17..24
所以在 #FF0000表示 这是: 255;0;0
#00FF00表示 这是: 0;255;0
那有意义吗? 您想要什么颜色将其与这三个8位值组合在一起。


参考:
维基百科
ANSI转义序列
tldp.org
tldp.org
misc.flogisoft.com
我不记得的一些博客/网页

阅读 608 次发布于 2019年12月24日
推荐阅读
为什么处理排序数组要比处理未排序数组快?

这是一段C ++代码,显示了一些非常特殊的行为。 出于某些奇怪的原因,奇迹般地对数据进行排序使代码快了将近六倍: #include #include #include int main() { // Generate data const unsigned arraySize = 32768; int da...

2019-12-20 阅读 10

如何撤消Git中的最新本地提交?

我不小心将错误的文件提交给Git ,但是我还没有将提交推送到服务器。 如何撤消本地存储库中的那些提交?

2019-12-20 阅读 12

如何在本地和远程删除Git分支?

我想在本地和远程删除分支。 尝试删除远程分支失败 $ git branch -d remotes/origin/bugfix error: branch 'remotes/origin/bugfix' not found. $ git branch -d origin/bugfix error: branch 'origin/bugfix' not found. $ git branch ...

2019-12-20 阅读 9

'git pull'和'git fetch'有什么区别?

主持人注意:鉴于此问题已经发布了67个答案 (其中一些已删除),请在发布另一个问题之前考虑您是否正在贡献新内容 。 git pull和git fetch什么区别?

2019-12-20 阅读 8

什么是正确的JSON内容类型?

我一直在弄乱JSON一段时间,只是将其作为文本推出,并没有伤害任何人(据我所知),但是我想正确地做事。 我已经看到许多所谓的JSON内容类型的“标准”: application/json application/x-javascript text/javascript text/x-javascript text/x-json 但是哪一个是正确的,还是最好的? 我发现在它们之间存在安全性和浏览...

2019-12-20 阅读 10

目录