Bash 'echo -e' 中的三个反斜杠表现得很奇怪

Tripple backslash in Bash 'echo -e' is acting strange

我有多个 Bash 变量用于 ANSI 终端颜色。一种是 ANSI_NOCOLOR 并定义为:

ANSI_NOCOLOR="\e[0m"

当我将它与反斜杠字符 \ 一起使用时(在 Bash 字符串中转义为 \),我得到了意外的输出。

示例:

echo -e "command --with --many --options \$ANSI_NOCOLOR"
echo -e "--more --options"

这导致:

command --with --many --options \e[0m
--more --options

这个例子可以简化为:

$ echo -e "\\e[0m"
\e[0m

为什么 Bash 中的三重反斜杠与其他类 C 语言中通常已知的不同?

预期/类似 C 的行为:

转义序列是左结合的。因此,

  1. 前两个\打印为\,
  2. 剩余的 \ 正在执行前瞻(1) 以查找 e 以创建 ESC 字符。

解决方法:
在用反斜杠进行一些刨削后,我发现 5 !!反斜杠是必需的。我仍然想阅读解释,为什么它的行为如此。

$ echo -e "\\\e[33mfoo\e[0m"
\foo

很难控制颜色重置序列,所以我的解决方法是使用两个 ANSI 颜色转义序列,将其设置为黄色并返回默认值。

发生这种情况是因为有两个级别的转义在起作用:

  1. 转义双引号字符串。此通行证识别 \ 但不识别 \e
  2. echo -e 转义序列。此通行证识别 \\e.

所以:

  1. 初始字符串为\\e
  2. 双引号替换了 \ 但保留了不受支持的 \e
  3. 你现在有 \e
  4. Echo 替换 \
  5. 你现在有 \e

这就是为什么当任何值可能包含反斜杠时您应该更喜欢 printf 而不是 echo 的众多原因之一。