6.1. 颜色

如前所述,非打印转义序列必须用以下字符括起来\[\033[\]。 对于颜色转义序列,它们还应后跟一个小写字母m.

如果您在 xterm 中尝试以下提示符,但发现没有看到指定的颜色,请检查您的~/.Xdefaults文件(以及可能的同类文件)中是否有如下行XTerm*Foreground: BlanchedAlmond。 可以通过在其前面放置一个感叹号(“!”)来注释掉此行。 当然,这也将取决于您使用的终端模拟器。 这是您的终端前景色最有可能被覆盖的地方。

要在提示符中包含蓝色文本

PS1="\[\033[34m\][\$(date +%H%M)][\u@\h:\w]$ "

此提示符的问题在于,以颜色代码 34 开头的蓝色永远不会切换回常规颜色,因此您在提示符后键入的任何文本仍将是提示符的颜色。 这也是一种深蓝色阴影,因此将其与粗体代码结合使用可能会有所帮助

PS1="\[\033[1;34m\][\$(date +%H%M)][\u@\h:\w]$\[\033[0m\] "

现在提示符为浅蓝色,并且通过将颜色切换回无(无论您之前拥有什么前景色)来结束。

以下是其余的颜色等效项

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

Daniel Dui (ddui@iee.org) 指出,为了严格准确起见,我们必须提到上面的列表是针对控制台颜色的。 在 xterm 中,代码1;31不是“浅红色”,而是“粗体红色”。 这对所有颜色都是如此。

您还可以通过使用 44 表示蓝色背景,41 表示红色背景等来设置背景颜色。 没有粗体背景颜色。 可以使用组合,例如蓝色背景上的浅红色文本\[\033[44;1;31m\],尽管分别设置颜色似乎效果更好(即\[\033[44m\]\[\033[1;31m\])。 其他可用的代码包括 4:下划线,5:闪烁,7:反色和 8:隐藏。

Note

许多人(包括我自己)强烈反对“闪烁”属性,因为它非常分散注意力且令人恼火。 幸运的是,它在我所知道的任何终端模拟器中都不起作用 - 但它仍然可以在控制台上工作。

Note

如果您想知道(就像我一样)“‘隐藏’属性有什么用?!” - 我看到它在一个示例 shell 脚本(不是提示符)中使用,以允许某人输入密码而不会将其回显到屏幕。 但是,除了“Xterm”之外,许多终端似乎都不支持此属性。

基于 Bashprompt 包中名为“elite2”的提示符(我已经对其进行了修改,使其在标准控制台上更好地工作,而不是使用查看原始文件所需的特殊 xterm 字体),这是一个我经常使用的提示符

 
function elite
{

local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"

case $TERM in
    xterm*|rxvt*)
        local TITLEBAR='\[\033]0;\u@\h:\w\007\]'
        ;;
    *)
        local TITLEBAR=""
        ;;
esac

local temp=$(tty)
local GRAD1=${temp:5}
PS1="$TITLEBAR\
$GRAY-$CYAN-$LIGHT_CYAN(\
$CYAN\u$GRAY@$CYAN\h\
$LIGHT_CYAN)$CYAN-$LIGHT_CYAN(\
$CYAN\#$GRAY/$CYAN$GRAD1\
$LIGHT_CYAN)$CYAN-$LIGHT_CYAN(\
$CYAN\$(date +%H%M)$GRAY/$CYAN\$(date +%d-%b-%y)\
$LIGHT_CYAN)$CYAN-$GRAY-\
$LIGHT_GRAY\n\
$GRAY-$CYAN-$LIGHT_CYAN(\
$CYAN\$$GRAY:$CYAN\w\
$LIGHT_CYAN)$CYAN-$GRAY-$LIGHT_GRAY " 
PS2="$LIGHT_CYAN-$CYAN-$GRAY-$NO_COLOUR "
}

我将颜色定义为临时 shell 变量,以提高可读性。 它更容易使用。 “GRAD1”变量是一个检查,用于确定您所在的终端。 就像确定您是否在 Xterm 中工作的测试一样,它只需要完成一次。 您看到的提示符看起来像这样,除了颜色

--(giles@gcsu202014)-(30/pts/6)-(0816/01-Aug-01)--
--($:~/tmp)--

为了帮助自己记住有哪些颜色可用,我编写了一个脚本,将所有颜色输出到屏幕。 Daniel Crisman 提供了一个更好的版本,我将其包含在下面

#!/bin/bash
#
#   This file echoes a bunch of color codes to the 
#   terminal to demonstrate what's available.  Each 
#   line is the color code of one forground color,
#   out of 17 (default + 16 escapes), followed by a 
#   test use of that color on all nine background 
#   colors (default + 8 escapes).
#

T='gYw'   # The test text

echo -e "\n                 40m     41m     42m     43m\
     44m     45m     46m     47m";

for FGs in '    m' '   1m' '  30m' '1;30m' '  31m' '1;31m' '  32m' \
           '1;32m' '  33m' '1;33m' '  34m' '1;34m' '  35m' '1;35m' \
           '  36m' '1;36m' '  37m' '1;37m';
  do FG=${FGs// /}
  echo -en " $FGs \033[$FG  $T  "
  for BG in 40m 41m 42m 43m 44m 45m 46m 47m;
    do echo -en "$EINS \033[$FG\033[$BG  $T  \033[0m";
  done
  echo;
done
echo