是否在任何地方为 bash 定义了终端颜色转义序列?

是否在任何地方为 bash 定义了终端颜色转义序列?

我在 Bash 脚本中经常使用颜色(主要是在 CentOS 上),但为了使它们的使用更方便,我最终重新定义变量到颜色值:

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\]"

或者也可以使用tput

bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`

我已经对/etc/rc.d/init.d目录进行了 grep 搜索,但没有找到与其中的颜色定义相关的任何内容。

是否已有这样的定义?如果不是,我会将它们放入一个文件中/etc/rc.d/init.d,并将其包含在我的脚本中,有点像/etc/rc.d/init.d/functions

答案1

您所要求的内容有几个方面在起作用。

首先,bash 没有定义颜色。事实上 bash 完全不知道颜色的存在。它只知道你告诉它输出字符\033[0;36m。您的终端模拟器(xterm、gnome-terminal 等)接收这些字符并理解“我需要开始以青色输出”。

因此,您的终端模拟器能够理解颜色。您的终端仿真器可以识别\033[0;36m青色,但另一个终端仿真器可能使用完全不同的青色字符集(尽管没有理智的终端仿真器会标榜标准并执行此操作)。这就是原因tput。当您运行 时tput setaf 6tput将查找终端的转义码中的颜色 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\]"

相关内容