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

fdu*_*uff 24 colors bash terminal

我在 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\]"
Run Code Online (Sandbox Code Playgroud)

或者也有tput

bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`
Run Code Online (Sandbox Code Playgroud)

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

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

phe*_*mer 39

你的要求有几个方面在起作用。

首先,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\]"
Run Code Online (Sandbox Code Playgroud)