我在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
在哪里可以找到可以使用的颜色代码列表?
我查看了Colorize Bash Console Color,但它没有回答有关实际代码列表的问题。
如果还有一个更具可读性的表格,那就太好了。
我在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
在哪里可以找到可以使用的颜色代码列表?
我查看了Colorize Bash Console Color,但它没有回答有关实际代码列表的问题。
如果还有一个更具可读性的表格,那就太好了。
Answers:
这些是ANSI转义序列 ; 该链接指向颜色代码图表,但该Wikipedia页面上还有其他有趣的内容。并非所有人都可以在(例如)普通的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终端(我想现在大多数都可以),则可以从此图表中应用颜色:

使用左下角的数字选择这些序列的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通过中的一些shell代码将$ TERM变量设置为256色终端/etc/profile。在其他情况下,您应该能够配置终端以使用此功能。这将使TUI应用程序知道有256种颜色,并允许您将类似的内容添加到您的~/.bashrc:
if [[ "$TERM" =~ 256color ]]; then
PS1="MyCrazyPrompt..."
fi
当心在提示中使用颜色转义序列时,应将它们括在转义的(带\前缀)方括号中,如下所示:
PS1="\[\033[01;32m\]MyPrompt: \[\033[0m\]"
请注意,[颜色序列的内部没有转义,而封闭了内部。后者的目的是向外壳指示封闭的序列不计入提示的字符长度。如果该计数是错误的,则当您回滚历史时会发生奇怪的事情,例如,如果它太长,则最后一个滚动字符串的多余长度将显示在提示中,并且您将不能退格到它(它与提示的方式一样被忽略)。
还要注意,如果您希望每次使用该提示时都包含命令运行的输出(而不是在设置提示时一次),则应将其设置为带单引号的文字字符串,例如:
PS1='\[\033[01;32m\]$(date): \[\033[0m\]'
尽管如果您对使用bash的特殊转义符\d或\D{format}快速转义符感到满意,这不是一个很好的例子-这不是问题的主题,但是可以在man bashunder中找到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"
echo非以破折号(-)开头的文字文本。不可携带。所有常见的实现都违反该标准,该标准规定不应支持任何选项。更糟糕的是,它们前后不一致。您应该printf改用。(并且不要将变量嵌入printf语句中,请使用%s。)
colortest-256以简洁的形式列出xterm调色板。(apt-get install colortest如果丢失)
看起来至少有一些列表是:
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
我编写了一个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中,或将其另存为脚本并以这种方式运行。您可以使用颜色来更改颜色,就像我对下面的名称所做的一样。
通过执行以下操作,我在.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
会将其设置为粗体。
另一个脚本,如TAFKA'goldilocks'发布的用于显示颜色的脚本,可能更实用一些,以供参考:
#!/bin/bash
useage() {
printf "\n\e[1;4mAscii Escape Code Helper Utility\e[m\n\n"
printf " \e[1mUseage:\e[m colors.sh [-|-b|-f|-bq|-fq|-?|?] [start] [end] [step]\n\n"
printf "The values for the first parameter may be one of the following:\n\n"
printf " \e[1m-\e[m Will result in the default output.\n"
printf " \e[1m-b\e[m This will display the 8 color version of this chart.\n"
printf " \e[1m-f\e[m This will display the 256 color version of this chart using foreground colors.\n"
printf " \e[1m-q\e[m This will display the 256 color version of this chart without the extra text.\n"
printf " \e[1m-bq\e[m This will display the 8 color version of this chart without the extra text.\n"
printf " \e[1m-fq\e[m This will display the 256 color version of this chart using foreground colors without the extra text.\n"
printf " \e[1m-?|?\e[m Displays this help screen.\n"
printf "\nThe remaining parameters are only used if the first parameter is one of: \e[1m-,-f,q,fq\e[m\n\n"
printf " \e[1mstart\e[m The color index to begin display at.\n"
printf " \e[1mend\e[m The color index to stop display at.\n"
printf " \e[1mstart\e[m The number of indexes to increment color by each iteration.\n\n\n"
}
verbose() {
if [[ "$1" != "-q" && "$1" != "-fq" && "$1" != "-bq" ]]; then
printf "\nTo control the display style use \e[1m%s\e[m where \e[1m%s\e[m is:\n" '\e[{$value}[:{$value}]m' '{$value}'
printf "\n 0 Normal \e[1m1 Bold\e[m \e[2m2 Dim\e[m \e[3m3 ???\e[m \e[4m4 Underlined\e[m \e[5m5 Blink\e[m \e[6m6 ???\e[m \e[7m7 Inverted\e[m \e[8m8 Hidden\e[m\n\n"
printf "If \e[1m%s\e[m is not provided it will reset the display.\n\n" '{$value}'
fi
}
eight_color() {
local fgc bgc vals seq0
if [ "$1" != "-bq" ]; then
printf "\n\e[1;4m8 Color Escape Value Pallette\e[m\n\n"
printf "Color escapes are \e[1m%s\e[m\n" '\e[${value};...;${value}m'
printf " Values \e[1m30..37\e[m are \e[1mforeground\e[m colors\n"
printf " Values \e[1m40..47\e[m are \e[1mbackground\e[m colors\n\n"
fi
for fgc in {30..37}; do
for bgc in {40..47}; do
fgc=${fgc#37}
bgc=${bgc#40}
vals="${fgc:+$fgc;}${bgc}"
vals=${vals%%;}
seq0="${vals:+\e[${vals}m}"
printf " %-9s" "${seq0:-(default)}"
printf " ${seq0}TEXT\e[m"
printf " \e[${vals:+${vals+$vals;}}1mBOLD\e[m"
done
printf "\e[0m\n"
done
}
if [[ "$1" == "-b" || "$1" == "-bq" ]]; then
eight_color "$1"
verbose "$1"
elif [[ "$1" == "" || "$1" == "-" || "$1" == "-f" || "$1" == "-q" || "$1" == "-fq" ]]; then
start=${2:-0}
end=${3:-255}
step=${4:-1}
color=$start
style="48;5;"
if [[ "$1" == "-f" || "$1" == "-fq" ]]; then
style="38;5;"
fi
perLine=$(( ( $(tput cols) - 2 ) / 9 ));
if [[ "$1" != "-q" && "$1" != "-fq" ]]; then
printf "\n\e[1;4m256 Color Escape Value Pallette\e[0m\n\n"
printf " \e[1m%s\e[m for \e[1mbackground\e[m colors\n \e[1m%s\e[m for \e[1mforeground\e[m colors\n\n" '\e[48;5;${value}m' '\e[38;5;${value}m'
fi
while [ $color -le $end ]; do
printf "\e[m \e[${style}${color}m %3d \e[m " $color
((color+=step))
if [ $(( ( ( $color - $start ) / $step ) % $perLine )) -eq 0 ]; then
printf "\n"
fi
done
printf "\e[m\n"
verbose "$1"
else
useage
fi
对于您使用的终端,此大小应正确。为此,它有点过头,但是现在您可以通过参数控制显示方式的许多方面。希望它们都是自我解释。
export PS1=\n\[\e[32;1m\](\[\e[37;1m\]\u\[\e[32;1m\])-(\[\e[37;1m\]jobs:\j\[\e[32;1m\])-(\[\e[37;1m\]\w\[\e[32;1m\])\n$ \[\e[0m\]
\]此处的最终字体实际上不是颜色序列的一部分。它的目的是专门设置提示(关于这一点,我在回答的末尾添加了几段)。 “如果还有一种更具可读性的表格,那就太好了。” ->在您自己的答案中剪切n'paste是执行此操作的一种方法。