协慌网

登录 贡献 社区

如何在 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" ,除非你想添加额外的空行)

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


用法

具体的tput子命令将在后面讨论。

直接

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

tput setaf 1; echo "this is red text"

使用;而不是&&所以如果tput错误文本仍显示。

Shell 变量

另一种选择是使用 shell 变量:

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而不是setab ,而setf而不是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 代码之前添加\]
例:
在常规使用中: \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 种模式:

色彩模式

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

  • 0重置
  • 1;比平时轻
  • 2;比平时更暗

此模式不受广泛支持。它完全支持 Gnome-Terminal。

2. 文本模式

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

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

并几乎得到支持。
例如 KDE-Konsole 支持5;但 Gnome-Terminal 没有,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                                            |                                                                                       |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|

下表显示了8 位版本的 ANSI 颜色的摘要

|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
| 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

下表显示了24 位版本的 ANSI 颜色的摘要

|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
| 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 位摘要

foreground.gif

.gif背景 8 位摘要

background.gif

颜色汇总及其值

在此输入图像描述 在此输入图像描述 在此输入图像描述 在此输入图像描述

在 KDE 终端上blinking

KDE-闪烁

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

cecho_screenshot

我开发的一种更先进的工具来处理这些颜色:
bline


彩色模式拍摄

褪色正常亮

文字模式拍摄

仅文本模式

合并是可以的

结合

更多的镜头


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

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

是的你可以。我经历过

他们是否会降低程序的速度?

我想不是。

我们可以在 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),然后将文件放入有效的PATH然后在任何您喜欢的地方使用它。

ls | pcc
df | pcc

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

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

PCC

处理 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( "clear" )这样你就可以使用它来代替system(3)调用

它们是否以 Unicode 格式提供?

是。 \u001b

这些颜色的哪个版本更可取?

它易于使用3/4-bit ,但使用24-bit非常准确和漂亮。
如果您没有经验,那么这里有一个快速教程:
24 位表示: 0000000000000000以及00000000 。每个 8 位用于特定颜色。
24..17是为了16..9 8..1
所以在 #FF0000意味着这里是: 255;0;0
#00FF00表示这里是: 0;255;0
那有意义吗?你想要什么颜色将它与这三个 8 位值结合起来。


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

徽章: