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

时间:2018-09-15 18:00:58

标签: bash escaping echo ansi-escape

我有多个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 个答案:

答案 0 :(得分:3)

之所以会发生这种情况,是因为有两种逃避工作方式:

  1. 转义为双引号字符串。此通行证可识别\\,但不能识别\e
  2. echo -e转义序列。此通行证可以同时识别\\\e

所以:

  1. 初始字符串为\\\e
  2. 双引号代替\\,但不支持不受支持的\e
  3. 您现在有\\e
  4. Echo取代了\\
  5. 您现在有\e

这是在任何值可能包含反斜杠时都应首选printf而不是echo的众多原因之一。