Bash 按字面打印颜色代码而不是实际颜色

Bash printing color codes literally and not in actual color

出于某种原因,我的 shell 脚本停止以彩色打印我的菜单,而是实际打印文字颜色代码。我是否以某种方式逃避了颜色编码?

脚本

#!/bin/bash 

function showEnvironments {
echo -e "\e[38;5;81m"
echo -e "      SELECT ENVIRONMENT       "
echo -e "[1] - QA"
echo -e "[2] - PROD"
echo -e "\e[0m"
}

showEnvironments

输出

\e[38;5;81m

SELECT ENVIRONMENT

[1] - Staging

[2] - QA

\e[0m

我在 Mac OSX 上使用 iTerm,TERM 环境变量设置为 xterm-256color

两个潜在的尝试:

  • 运行 stty sane 重置终端设置
  • 检查 $TERM 环境变量

有两种方法可以做到这一点:直接引用颜色或分配给变量以便稍后在脚本中更容易地引用它们。

cNone='3[00m'
cRed='3[01;31m'
cGreen='3[01;32m'
cYellow='3[01;33m'
cPurple='3[01;35m'
cCyan='3[01;36m'
cWhite='3[01;37m'
cBold='3[1m'
cUnderline='3[4m'

echo -e "3[01;31m"
echo -e "hello"
echo -e "3[00m"

echo -e "${cGreen}"
echo -e "hello"
echo -e "${cNone}"

希望对您有所帮助。

我明白了。我的终端似乎无法识别我用于颜色代码的转义字符。

基于 http://misc.flogisoft.com/bash/tip_colors_and_formatting#colors1 有效的转义码是:

\e
3
\x1B

当我将颜色从 \e[38;5;81m 更改为 \033[38;5;81m 时,它开始了按预期工作。

感谢大家的建议和帮助!

bash 3.2.x 中 echo -e 的实现有几个明显的错误,这是 Mac OS X 附带的。该文档声称 \E(而不是 \e)代表 ESC,但两者似乎都不起作用。您可以使用 printf 代替:

printf "\e[38;5;81mfoo\e[0m\n"

或使用(如您所见)3 表示 ESC。

更高版本的 bash(肯定是 4.3,也可能是更早的 4.x 版本)修复了这个问题并允许使用 \e\E