Bash打印颜色代码文字而非实际颜色的方法

12

由于某些原因,我的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

选择环境

[1] - 海报

[2] - QA

\e[0m

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


你应该编辑你的问题,包括你正在使用的终端模拟器和TERM环境变量的内容。 - Anthony Geoghegan
TERM=xterm-256color TERM_PROGRAM=iTerm.app这是您要找的吗? - Adrian E
是的。我已经编辑了你的问题,包括这个重要信息。我不使用Mac,所以我不知道iTerm需要如何配置才能正确解释ANSI转义序列。 - Anthony Geoghegan
就输出到文件而言,我最终使用了以下命令:echo "$stuff" >> myscript.sh - Devin Rhode
我有相反的问题,需要检查原始文本,而不进行解释。 - Devin Rhode
4个回答

20

在Mac OS X中默认安装的 bash 版本3.2.x实现的 echo -e 存在几个明显的bug。文档说明 \E (而非 \e) 表示ESC,但似乎都不能正常工作。可以使用 printf 来代替:

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

或者使用(如您所发现的)\033 代表 ESC。

bash 的后续版本(肯定包括4.3,可能也包括更早的4.x版本)解决了这个问题,允许使用 \e\E


我想知道在zsh中如何处理这个问题? - Devin Rhode
1
zsh中运行良好,至少在5.7.1版本中是这样。我不知道早期版本的zsh是否存在类似的错误(我认为没有理由认为会有,因为bash有一个错误)。 - chepner
zsh中这不是一个大问题(除非你试图将其用作POSIX shell,例如/bin/sh),因为你可以以与终端无关的方式编写类似于print -P "%F{81}foo%f"的内容。 - chepner

10

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

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

echo -e "\033[01;31m"
echo -e "hello"
echo -e "\033[00m"

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

我希望这有所帮助。


4
我已经理解了。看起来我在使用的颜色代码的转义字符在我的终端中无法识别。
根据http://misc.flogisoft.com/bash/tip_colors_and_formatting#colors1,有效的转义代码如下:
\e
\033
\x1B

当我把颜色从\e[38;5;81m改成\033[38;5;81m时,它开始按预期工作。
感谢其他人的建议和帮助!

1

有两个可能尝试的方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接