我可以在 Bash PS1 提示符中使用哪些颜色代码?

我可以在 Bash PS1 提示符中使用哪些颜色代码?

我在 bash PS1 提示符中使用了多种颜色,例如:

\033]01;31\] # pink
\033]00m\]   # white
\033]01;36\] # bold green
\033]02;36\] # green
\033]01;34\] # blue
\033]01;33\] # bold yellow

在哪里可以找到可以使用的颜色代码列表?

我在看对 Bash 控制台颜色进行着色但它没有回答我关于实际代码列表的问题。

如果还有一个更具可读性的表格那就太好了。

也可以看看:如何让 PS1 提示显示时间、用户、主机、目录和 Git 分支

答案1

那些是ANSI 转义序列;该链接指向颜色代码图表,但该维基百科页面上还有其他有趣的内容。并非所有这些都可以在(例如)普通的 Linux 控制台上运行。

这是不正确的:

\033]00m\] # white

0将终端重置为其默认值(可能是白色)。白色前景的实际代码是 37。此外,末尾的转义右大括号 ( \]) 不是颜色序列的一部分(请参阅下面的最后几段以了解其设置提示的目的的说明)。

请注意,某些 GUI 终端允许您指定自定义的颜色方案。这会影响输出。

这里有一个列表它添加了 7 种前景色和 7 种背景色,我以前从未见过,但它们似乎有效:

# Foreground colors
90   Dark gray  
91   Light red  
92   Light green    
93   Light yellow   
94   Light blue 
95   Light magenta  
96   Light cyan  

# Background colors
100  Dark gray  
101  Light red  
102  Light green    
103  Light yellow   
104  Light blue 
105  Light magenta  
106  Light cyan 

此外,如果您有一个 256 色 GUI 终端(我想现在大多数都是),您可以应用此图表中的颜色:

xterm 256 色卡

选择这些的 ANSI 序列使用左下角的数字,38;5;从前景和48;5;背景开始,然后是颜色编号,例如:

echo -e "\\033[48;5;95;38;5;214mhello world\\033[0m"

给我一个棕褐色的浅橙色(意思是,比色表是粗略的近似值)。

您可以很容易地看到图表1中的颜色,因为它们会很容易地出现在您的终端上:

#!/bin/bash

color=16;

while [ $color -lt 245 ]; do
    echo -e "$color: \\033[38;5;${color}mhello\\033[48;5;${color}mworld\\033[0m"
    ((color++));
done  

输出是不言自明的。

xterm-256color如果您使用 256 色终端,某些系统会通过/etc/profile.在其他情况下,您应该能够配置您的终端以使用它。这将使 TUI 应用程序知道有 256 种颜色,并允许您将如下内容添加到您的~/.bashrc

if [[ "$TERM" =~ 256color ]]; then
     PS1="MyCrazyPrompt..."
fi

请注意,当您在提示中使用颜色转义序列时,应该将它们括在转义(\带前缀)方括号中,如下所示:

PS1="\[\033[01;32m\]MyPrompt: \[\033[0m\]"

请注意,[颜色序列的内部并未转义,但外围的颜色序列却被转义。后者的目的是向 shell 指示所包含的序列不计入提示符的字符长度。如果该计数错误,当您向后滚动历史记录时,会发生奇怪的事情,例如,如果历史记录太长,则最后滚动的字符串的多余长度将附加到您的提示中,并且您将无法退格到它(它与提示符一样被忽略)。

另请注意,如果您希望包含每次使用提示时运行的命令的输出(而不是在设置提示时只运行一次),则应将其设置为带单引号的文字字符串,例如:

PS1='\[\033[01;32m\]$(date): \[\033[0m\]'

尽管这不是一个很好的例子,如果您喜欢使用 bash 的特殊\d\D{format}提示转义符——这不是问题的主题,但可以在man bash下面找到PROMPTING。还有各种其他有用的转义符,例如\w当前目录、\u当前用户等。


1. 该图表的主要部分,颜色 16 - 231(注意它们不是按数字顺序排列)是一个 6 x 6 x 6 RGB 颜色立方体。 “颜色立方体”是指 RGB 颜色空间可以使用三维数组(一个轴代表红色,一个轴代表绿色,一个轴代表蓝色)来表示。这里立方体中的每种颜色都可以表示为 6 x 6 x 6 数组中的坐标,图表中的索引如下计算:

    16 + R * 36 + G * 6 + B

立方体中的第一种颜色(图表中索引 16 处)是黑色 (RGB 0, 0, 0)。您可以在 shell 脚本中使用此公式:

#!/bin/sh                                                         

function RGBcolor {                                               
    echo "16 + $1 * 36 + $2 * 6 + $3" | bc                        
}                                                                 

fg=$(RGBcolor 1 0 2)  # Violet                                            
bg=$(RGBcolor 5 3 0)  # Bright orange.                                            

echo -e "\\033[1;38;5;$fg;48;5;${bg}mviolet on tangerine\\033[0m"

答案2

看起来至少有一些列表是:

txtblk='\e[0;30m' # Black - Regular
txtred='\e[0;31m' # Red
txtgrn='\e[0;32m' # Green
txtylw='\e[0;33m' # Yellow
txtblu='\e[0;34m' # Blue
txtpur='\e[0;35m' # Purple
txtcyn='\e[0;36m' # Cyan
txtwht='\e[0;37m' # White
bldblk='\e[1;30m' # Black - Bold
bldred='\e[1;31m' # Red
bldgrn='\e[1;32m' # Green
bldylw='\e[1;33m' # Yellow
bldblu='\e[1;34m' # Blue
bldpur='\e[1;35m' # Purple
bldcyn='\e[1;36m' # Cyan
bldwht='\e[1;37m' # White
unkblk='\e[4;30m' # Black - Underline
undred='\e[4;31m' # Red
undgrn='\e[4;32m' # Green
undylw='\e[4;33m' # Yellow
undblu='\e[4;34m' # Blue
undpur='\e[4;35m' # Purple
undcyn='\e[4;36m' # Cyan
undwht='\e[4;37m' # White
bakblk='\e[40m'   # Black - Background
bakred='\e[41m'   # Red
bakgrn='\e[42m'   # Green
bakylw='\e[43m'   # Yellow
bakblu='\e[44m'   # Blue
bakpur='\e[45m'   # Purple
bakcyn='\e[46m'   # Cyan
bakwht='\e[47m'   # White
txtrst='\e[0m'    # Text Reset

基于https://wiki.archlinux.org/index.php/Color_Bash_Prompt

答案3

我写了一个 bash 函数,可以显示所有颜色,如果这有帮助的话。

function colorgrid( )
{
    iter=16
    while [ $iter -lt 52 ]
    do
        second=$[$iter+36]
        third=$[$second+36]
        four=$[$third+36]
        five=$[$four+36]
        six=$[$five+36]
        seven=$[$six+36]
        if [ $seven -gt 250 ];then seven=$[$seven-251]; fi

        echo -en "\033[38;5;$(echo $iter)m█ "
        printf "%03d" $iter
        echo -en "   \033[38;5;$(echo $second)m█ "
        printf "%03d" $second
        echo -en "   \033[38;5;$(echo $third)m█ "
        printf "%03d" $third
        echo -en "   \033[38;5;$(echo $four)m█ "
        printf "%03d" $four
        echo -en "   \033[38;5;$(echo $five)m█ "
        printf "%03d" $five
        echo -en "   \033[38;5;$(echo $six)m█ "
        printf "%03d" $six
        echo -en "   \033[38;5;$(echo $seven)m█ "
        printf "%03d" $seven

        iter=$[$iter+1]
        printf '\r\n'
    done
}

您可以将其放入 .bashrc / .bash_profile / .bash_aliases 中或将其保存为脚本并以这种方式运行。您可以使用颜色来更改颜色,就像我在下面使用我的名字所做的那样。

colorgrid() 输出: colorgrid() 的输出

我通过执行以下操作在 .bash_profile 中更改了我的名字:

if [ "$USER" = "plasmarob" ]; then
    p="\[\033[01;38;5;52m\]p"
    l="\[\033[01;38;5;124m\]l"
    a="\[\033[01;38;5;196m\]a"
    s="\[\033[01;38;5;202m\]s"
    m="\[\033[01;38;5;208m\]m"
    a2="\[\033[01;38;5;214m\]a"
    r="\[\033[01;38;5;220m\]r"
    o="\[\033[01;38;5;226m\]o"
    b="\[\033[01;38;5;228m\]b"
    local __user_and_host="$p$l$a$s$m$a2$r$o$b"
else
    local __user_and_host="\[\033[01;36m\]\u"
fi   

...

export PS1="$__user_and_host $__cur_location $__git_branch_color$__git_branch$__prompt_tail$__last_color "

请注意,字符串中的 01 前缀\[\033[01;38;5;214m\]a 将其设置为粗体。

答案4

您可以基于@goldilocks 和@Michael Durrant 的答案来创建更具可读性的内容,如下所示:

CYAN="\[\e[01;36m\]"
WHITE="\[\e[01;37m\]"
BLUE="\[\e[01;34m\]"
TEXT_RESET="\[\e[00m\]"   
TIME="\t"
CURRENT_PATH="\W"
ROOT_OR_NOT="\$"

export PS1="${CYAN}[${BLUE}${TIME}${WHITE} ${CURRENT_PATH}${CYAN}]${ROOT_OR_NOT}${TEXT_RESET} "

这将导致:

预览

相关内容