是否为bash定义了终端颜色转义序列?


22

我在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目录,但是没有找到与颜色定义有关的任何内容。

已经有这样的定义了吗?如果不是的话,我会把它们放入一个文件中/etc/rc.d/init.d说出来,并把它包含在我的脚本中,有点像/etc/rc.d/init.d/functions


它们不是(\e[1;30m例如),因为从技术上讲,它并不代表灰色,而是通常由终端将颜色插槽显示为灰色。终端仿真器可以自由更改实际的显示颜色,并且通常使它们成为用户可配置的选项。
chepner 2014年

Answers:


36

您所要求的内容有多个方面。

首先,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必须知道命令何时应换行到下一行。为此,它将计算提示的宽度,然后计算您键入的宽度。

关于的另一个说明tputCYAN="\[\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\]"

使用Ctrl+ Alt+ 登录到真实终端时,如何查看颜色F1
Serge Stroobandt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.