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) 以查找 e
以创建 ESC
字符。
解决方法:
在用反斜杠进行一些刨削后,我发现 5 !!反斜杠是必需的。我仍然想阅读解释,为什么它的行为如此。
$ echo -e "\\\e[33mfoo\e[0m"
\foo
很难控制颜色重置序列,所以我的解决方法是使用两个 ANSI 颜色转义序列,将其设置为黄色并返回默认值。
发生这种情况是因为有两个级别的转义在起作用:
- 转义双引号字符串。此通行证识别
\
但不识别 \e
echo -e
转义序列。此通行证识别 \
和 \e
.
所以:
- 初始字符串为
\\e
- 双引号替换了
\
但保留了不受支持的 \e
- 你现在有
\e
- Echo 替换
\
- 你现在有
\e
这就是为什么当任何值可能包含反斜杠时您应该更喜欢 printf
而不是 echo
的众多原因之一。
我有多个 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) 以查找e
以创建ESC
字符。
解决方法:
在用反斜杠进行一些刨削后,我发现 5 !!反斜杠是必需的。我仍然想阅读解释,为什么它的行为如此。
$ echo -e "\\\e[33mfoo\e[0m"
\foo
很难控制颜色重置序列,所以我的解决方法是使用两个 ANSI 颜色转义序列,将其设置为黄色并返回默认值。
发生这种情况是因为有两个级别的转义在起作用:
- 转义双引号字符串。此通行证识别
\
但不识别\e
echo -e
转义序列。此通行证识别\
和\e
.
所以:
- 初始字符串为
\\e
- 双引号替换了
\
但保留了不受支持的\e
- 你现在有
\e
- Echo 替换
\
- 你现在有
\e
这就是为什么当任何值可能包含反斜杠时您应该更喜欢 printf
而不是 echo
的众多原因之一。