ANSI 转义在 `printf` 中不起作用
ANSI escapes don't work in `printf`
当尝试使用 ANSI color escapes from a shell script 时,我完全被卡住了,因为转义序列 (\e
) 被逐字打印到输出中。
#!/bin/sh
GREEN="\e[32m"
RED="\e[31m"
CLEAR="\e[0m"
printf "${GREEN}test passed${CLEAR}\n"
printf "${RED}test failed${CLEAR}\n"
生产
\e[32mtest passed\e[0m
\e[31mtest failed\e[0m
解决方案是在第一行使用 #!/bin/bash
而不是 #!/bin/sh
,因为原始 sh
的 printf
不理解转义。
\e
不被 POSIX sh
识别(如 honzasp 所述),但 3
是。
GREEN='3[32m'
CLEAR='3[0m'
printf "${GREEN}testpassed${CLEAR}\n"
一般来说,不在 printf
的第一个参数内扩展参数会更安全(考虑,例如 FOO="hello %s"; printf "$FOO bar \n" baz;
)。但是,这需要您在参数中嵌入 actual 转义字符,而不是 printf
解释为转义字符的字符串。
GREEN=$(printf '3[32m')
CLEAR=$(printf '3[0m')
printf '%stest passed%s' "$GREEN" "$CLEAR"
当尝试使用 ANSI color escapes from a shell script 时,我完全被卡住了,因为转义序列 (\e
) 被逐字打印到输出中。
#!/bin/sh
GREEN="\e[32m"
RED="\e[31m"
CLEAR="\e[0m"
printf "${GREEN}test passed${CLEAR}\n"
printf "${RED}test failed${CLEAR}\n"
生产
\e[32mtest passed\e[0m
\e[31mtest failed\e[0m
解决方案是在第一行使用 #!/bin/bash
而不是 #!/bin/sh
,因为原始 sh
的 printf
不理解转义。
\e
不被 POSIX sh
识别(如 honzasp 所述),但 3
是。
GREEN='3[32m'
CLEAR='3[0m'
printf "${GREEN}testpassed${CLEAR}\n"
一般来说,不在 printf
的第一个参数内扩展参数会更安全(考虑,例如 FOO="hello %s"; printf "$FOO bar \n" baz;
)。但是,这需要您在参数中嵌入 actual 转义字符,而不是 printf
解释为转义字符的字符串。
GREEN=$(printf '3[32m')
CLEAR=$(printf '3[0m')
printf '%stest passed%s' "$GREEN" "$CLEAR"