我有这个:
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 的事情