如何在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='33[0;31m'
NC='33[0m' # No Color
printf "I ${RED}love${NC} Stack Overflown"

用红色打印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变量:

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 7nsetb 1" | tput -S  # set fg white and bg red

也可以看看

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

  • 您可以使用的一些变量:

    # Reset
    Color_Off='33[0m'       # Text Reset
    
    # Regular Colors
    Black='33[0;30m'        # Black
    Red='33[0;31m'          # Red
    Green='33[0;32m'        # Green
    Yellow='33[0;33m'       # Yellow
    Blue='33[0;34m'         # Blue
    Purple='33[0;35m'       # Purple
    Cyan='33[0;36m'         # Cyan
    White='33[0;37m'        # White
    
    # Bold
    BBlack='33[1;30m'       # Black
    BRed='33[1;31m'         # Red
    BGreen='33[1;32m'       # Green
    BYellow='33[1;33m'      # Yellow
    BBlue='33[1;34m'        # Blue
    BPurple='33[1;35m'      # Purple
    BCyan='33[1;36m'        # Cyan
    BWhite='33[1;37m'       # White
    
    # Underline
    UBlack='33[4;30m'       # Black
    URed='33[4;31m'         # Red
    UGreen='33[4;32m'       # Green
    UYellow='33[4;33m'      # Yellow
    UBlue='33[4;34m'        # Blue
    UPurple='33[4;35m'      # Purple
    UCyan='33[4;36m'        # Cyan
    UWhite='33[4;37m'       # White
    
    # Background
    On_Black='33[40m'       # Black
    On_Red='33[41m'         # Red
    On_Green='33[42m'       # Green
    On_Yellow='33[43m'      # Yellow
    On_Blue='33[44m'        # Blue
    On_Purple='33[45m'      # Purple
    On_Cyan='33[46m'        # Cyan
    On_White='33[47m'       # White
    
    # High Intensity
    IBlack='33[0;90m'       # Black
    IRed='33[0;91m'         # Red
    IGreen='33[0;92m'       # Green
    IYellow='33[0;93m'      # Yellow
    IBlue='33[0;94m'        # Blue
    IPurple='33[0;95m'      # Purple
    ICyan='33[0;96m'        # Cyan
    IWhite='33[0;97m'       # White
    
    # Bold High Intensity
    BIBlack='33[1;90m'      # Black
    BIRed='33[1;91m'        # Red
    BIGreen='33[1;92m'      # Green
    BIYellow='33[1;93m'     # Yellow
    BIBlue='33[1;94m'       # Blue
    BIPurple='33[1;95m'     # Purple
    BICyan='33[1;96m'       # Cyan
    BIWhite='33[1;97m'      # White
    
    # High Intensity backgrounds
    On_IBlack='33[0;100m'   # Black
    On_IRed='33[0;101m'     # Red
    On_IGreen='33[0;102m'   # Green
    On_IYellow='33[0;103m'  # Yellow
    On_IBlue='33[0;104m'    # Blue
    On_IPurple='33[0;105m'  # Purple
    On_ICyan='33[0;106m'    # Cyan
    On_IWhite='33[0;107m'   # White
    

    分别为bashhexoctal的转义字符:

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

    简短的例子:

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

    bash例外:

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

  • PS0
  • PS1
  • PS2(=用于提示)
  • PS4
  • 你应该添加额外的转义字符,以便bash可以正确解释它们。 如果不添加额外的转义字符,它可以工作,但是当您在历史记录中使用Ctrl + r进行搜索时,您将面临问题。

    bash的例外规则

    您应该在任何结束符之后添加[在任何启动ANSI代码之前添加]
    例:
    经常使用: 33[32mThis is in green33[0m
    对于PS0 / 1/2/4: [33[32m]This is in green[33[m]

    [用于启动一系列不可打印的字符
    ]用于不可打印字符序列的结尾

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

    颜色顺序的类型:

  • 3/4位
  • 8位
  • 24位
  • 在深入研究这些颜色之前,您应该了解这些代码的4种模式:

    1.色彩模式

    它修改了颜色非文字的风格。 例如,使颜色变亮或变暗。

  • 0重置
  • 1; 比平常轻
  • 2; 比正常情况下更暗
  • 这种模式不被广泛支持。 它完全支持Gnome-Terminal。

    2.文本模式

    此模式用于修改文字NOT颜色的样式。

  • 3; 斜体
  • 4; 强调
  • 5; 闪烁(慢)
  • 6; 闪烁(快速)
  • 7; 相反
  • 8; 隐藏
  • 9; 划掉
  • 并几乎得到支持。
    例如KDE-Konsole支持5; 但Gnome-Terminal不支持Gnome支持8; 但是KDE没有。

    3.前景模式

    此模式用于着色前景。

    4.后台模式

    该模式用于对背景进行着色。

    下表显示了ANSI颜色的3/4位版本的摘要

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

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

    |------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
    | foreground | octal     | hex       | bash    | description      | example                            | NOTE                    |
    |------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
    |        0-7 | 33[38;5 | x1b[38;5 | e[38;5 | standard. normal | echo -e '33[38;5;1m####33[m'   |                         |
    |       8-15 |           |           |         | standard. light  | echo -e '33[38;5;9m####33[m'   |                         |
    |     16-231 |           |           |         | more resolution  | echo -e '33[38;5;45m####33[m'  | has no specific pattern |
    |    232-255 |           |           |         |                  | echo -e '33[38;5;242m####33[m' | from black to white     |
    |------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
    | foreground | octal     | hex       | bash    | description      | example                            | NOTE                    |
    |------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
    |        0-7 |           |           |         | standard. normal | echo -e '33[48;5;1m####33[m'   |                         |
    |       8-15 |           |           |         | standard. light  | echo -e '33[48;5;9m####33[m'   |                         |
    |     16-231 |           |           |         | more resolution  | echo -e '33[48;5;45m####33[m'  |                         |
    |    232-255 |           |           |         |                  | echo -e '33[48;5;242m####33[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 | 33[38;2 | x1b[38;2 | e[38;2 | R = red     | echo -e '33[38;2;255;0;02m####33[m'  | R=255, G=0, B=0 |
    |      0-255 | 33[38;2 | x1b[38;2 | e[38;2 | G = green   | echo -e '33[38;2;;0;255;02m####33[m' | R=0, G=255, B=0 |
    |      0-255 | 33[38;2 | x1b[38;2 | e[38;2 | B = blue    | echo -e '33[38;2;0;0;2552m####33[m'  | R=0, G=0, B=255 |
    |------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
    | background | octal     | hex       | bash    | description | example                                  | NOTE            |
    |------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
    |      0-255 | 33[48;2 | x1b[48;2 | e[48;2 | R = red     | echo -e '33[48;2;255;0;02m####33[m'  | R=255, G=0, B=0 |
    |      0-255 | 33[48;2 | x1b[48;2 | e[48;2 | G = green   | echo -e '33[48;2;;0;255;02m####33[m' | R=0, G=255, B=0 |
    |      0-255 | 33[48;2 | x1b[48;2 | e[48;2 | B = blue    | echo -e '33[48;2;0;0;2552m####33[m'  | R=0, G=0, B=255 |
    |------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
    

    一些屏幕截图

    一个.gif前景8位摘要

    foreground.gif

    背景8位摘要在.gif

    background.gif

    颜色总结与他们的价值观

    在这里输入图像描述在这里输入图像描述在这里输入图像描述在这里输入图像描述

    在KDE终端上blinking

    KDE-闪烁

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

    cecho_screenshot

    我开发的一个更高级的工具来处理这些颜色:
    bline


    色彩模式镜头

    褪色正常亮

    文本模式拍摄

    仅文本模式

    结合就OK了

    结合

    更多的镜头


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

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

    是的你可以。 我经历了bash,c,c ++,d perl,python

    他们是否放慢了节目的速度?

    我想不是。

    我们可以在Windows上使用这些吗?

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

    如何计算代码的长度?

    33[ = 2,其他部分1

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

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

    #!/usr/bin/perl -n
    print "33[1m33[31m$133[36m$233[32m$333[33m$433[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;
    

    处理Unicode的。

    这些代码是否仅着色?

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

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

    要么:

    echo -e '33[2J33[u' # clear the screen and reset the position
    

    有很多初学者想要用system( "clear" )清除屏幕system( "clear" )所以你可以用这个来代替system(3)调用

    它们是否可用于Unicode?

    是。 u001b

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

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


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

    徽章:

    链接地址: http://www.djcxy.com/p/9587.html

    上一篇: How to change the output color of echo in Linux

    下一篇: How to create a CPU spike with a bash command