我真的很难理解处理时的行为echo
(以及其他此类命令)ANSI 转义码打印彩色消息。
我知道我可以使用-e
这样的选项:
echo -e "\e[32m FOO \e[0m"
我的消息将成功着色。
另外,我注意到我可以将 的输出分配echo -e
给一个变量,然后在新echo
命令中重新使用该变量没有-e
选项,无论如何这都会起作用。
foo=$(echo -e "\e[32m FOO \e[0m")
echo $foo
echo -e
那么,遇到 ANSI 代码时实际发出的“原始字节”是多少?我的foo
变量包含什么?我怎样才能将它们直接集成到我的系统中echo "??? FOO ???"
而不需要该-e
选项?
答案1
初始的“原始输出”echo
将包含实际的转义字符(ASCII 代码 27,八进制 033)而不是\e
。字符串的其余部分保持原样。这是用转义字符替换字符序列的-e
选项(就像用制表符等替换一样)echo
bash
\e
\t
要将转义字符直接合并到$foo
而不经过echo -e
,您必须在字符串中键入实际的转义字符。
在 中,您可以通过按 后按 来bash
键入文字转义字符。Ctrl+VEsc
在终端中,这看起来像
foo="^[[32mFOO^[[0m"
其中每个^[
由 生成,Ctrl+V后跟Esc.
或者,您可以使用$'...'
("C string interpolation" in bash
) 来扩展\e
:
foo=$'\e[32mFOO\e[0m'