![是否在任何地方为 bash 定义了终端颜色转义序列?](https://linux22.com/image/56678/%E6%98%AF%E5%90%A6%E5%9C%A8%E4%BB%BB%E4%BD%95%E5%9C%B0%E6%96%B9%E4%B8%BA%20bash%20%E5%AE%9A%E4%B9%89%E4%BA%86%E7%BB%88%E7%AB%AF%E9%A2%9C%E8%89%B2%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97%EF%BC%9F.png)
我在 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 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\]"