您所要求的内容有多个方面。
首先,bash不能定义颜色。实际上,bash完全不知道颜色甚至存在。它只知道您告诉它输出字符\033[0;36m
。您的终端仿真器(xterm,gnome-terminal等)接收这些字符并理解“我需要开始以青色输出”。
因此,您的终端仿真器才了解颜色。您的终端仿真器理解\033[0;36m
为青色,但是另一个终端仿真器可能对青色使用完全不同的字符集(尽管没有理智的终端仿真器会标榜标准并执行此操作)。这就是原因tput
。运行时tput setaf 6
,tput
将查找终端的颜色6(青色)的转义码,并输出该转义码。
(有关代码的更多信息,请参见此问题tput setaf
)
现在回到bash。您可能已经注意到,当我指的是青色时,我一直在使用\033[0;36m
,而不是\[\033[0;36m\]
。方括号已丢失。方括号的目的是在提示中使用转义码(颜色)时,bash必须知道哪些字符是非打印字符(零宽度,实际上不显示任何内容)。因此,您将非打印字符括在中\[
\]
。如果删除这些字符,一开始似乎一切都很好,但是当命令超出终端宽度时,您将开始遇到各种各样的怪异现象。这是因为键入时,bash必须知道命令何时应换行到下一行。为此,它将计算提示的宽度,然后计算您键入的宽度。
关于的另一个说明tput
。CYAN="\[\033[0;36m\]"
是不一样的东西CYAN="$(tput setaf 6)"
。正如我们刚刚讨论的那样,方括号与bash有关,tput
仅用于输出终端转义码。
由于方括号通常仅与提示相关,因此,如果在脚本或其他内容的输出中使用颜色,则不应使用它们。这意味着,如果您要使用颜色多于提示,则需要定义多个变量。一种带有方括号用于提示,另一种则没有。尽管您每次在提示中引用颜色时都可以手动添加方括号。
长话短说,您可能想要定义以下内容:
local CYAN="$(tput setaf 6)" # OR CYAN="\033[0;36m"
local LIGHT_CYAN="$CYAN$(tput bold)" # OR LIGHT_CYAN="\033[1;36m"
local PROMPT_CYAN="\[$CYAN\]"
local PROMPT_LIGHT_CYAN="\[$LIGHT_CYAN\]"
\e[1;30m
例如),因为从技术上讲,它并不代表灰色,而是通常由终端将颜色插槽显示为灰色。终端仿真器可以自由更改实际的显示颜色,并且通常使它们成为用户可配置的选项。