Bash ANSI转义don';我不能用printf工作`
在尝试使用时,我完全被卡住了,因为转义序列(Bash ANSI转义don';我不能用printf工作`,bash,printf,sh,ansi-colors,Bash,Printf,Sh,Ansi Colors,在尝试使用时,我完全被卡住了,因为转义序列(\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在第一行,因为原
\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
不被POSIXsh
识别(如honzasp所述),但\033
被识别
GREEN='\033[32m'
CLEAR='\033[0m'
printf "${GREEN}testpassed${CLEAR}\n"
通常,不将第一个参数中的参数展开为printf
(例如,考虑FOO=“hello%s”;printf“$FOO bar\n”baz;
)更安全。但是,这需要在参数中嵌入实际的转义字符,而不是printf
解释为转义字符的字符串
GREEN=$(printf '\033[32m')
CLEAR=$(printf '\033[0m')
printf '%stest passed%s' "$GREEN" "$CLEAR"
我第一次花了很长时间试图找出这个问题,现在它又咬了我一口,所以我决定下次避免这种经历:)在Linux上还有一个外部命令
printf(1)
,所以用完整路径调用外部命令也可能行得通:/usr/bin/printf“…”
(假设printf(1)
实际上存在于您系统上的/usr/bin
中。绿色=$(printf'\033[32m')
可以写成printf-v绿色'\033[32m')
以提高效率(避免子shell被分叉)。对于CLEAR
也一样。printf-v
不是POSIX外壳规范的一部分。