在 bash shell 中获取颜色

在 bash shell 中获取颜色

我有这个:

ql_gray='\033[1;30m'
ql_magenta='\033[1;35m'
ql_cyan='\033[1;36m'
ql_orange='\033[1;33m'
ql_green='\033[1;32m'
ql_no_color='\033[0m'

我这样使用它们:

echo "${ql_magenta}quicklock: could not acquire lock with name '${qln}'${ql_no_color}."

但我明白了:

\033[1;35mquicklock: could not acquire lock with name '/Users/me/.quicklock/locks/_oresoftware.lock'\033[0m.

我需要设置一些标志才能识别控制字符吗?

是否有一些标志我可以检查以查看最终用户是否允许识别控制字符?如果它们不被识别,那么我可以将上面的设置设置为:

ql_gray=''
ql_magenta=''
ql_cyan=''
ql_orange=''
ql_green=''
ql_no_color=''

我需要支持 Bash 版本 3+。

答案1

执行此操作的便携式方法是使用tput:

ql_gray=$(tput setaf 7)
ql_magenta=$(tput setaf 5)
ql_cyan=$(tput setaf 6)
ql_orange=$(tput setaf 3)
ql_green=$(tput setaf 2)
ql_no_color=$(tput sgr0)

这将考虑当前的终端设置。官方颜色列表记录在联机terminfo(5)帮助页,但您可能需要进行试验 - 例如在上面的列表中,7 正式为白色(但在大多数终端中最终呈现浅灰色),3 正式为黄色(但在大多数终端中最终呈现深黄色或橙色)。您可以通过在TERM=dumb调用之前设置来禁用颜色tput

答案2

您需要让 bash 来解释字符串中的转义序列。您可以使用以下任一方法:

echo -e "${ql_gray}..."
printf "%b\n" "${ql_gray}..."

或者在设置变量时评估它们:

ql_gray=$'\033[1;30m'

然后:

echo "${ql_gray}..."
printf "%s\n" "${ql_gray}..."

答案3

使用该标志将识别控制字符,而不是echo使用 use 。echo -e

printf也可能有效,这显然是 POSIX 的事情

相关内容