我有多个ANSI终端颜色的Bash变量。一个是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
\\
\e
这是为什么当任何值可能包含反斜杠时,你应该更喜欢printf
而不是echo
的众多原因之一。