I have a shell script that uses the following to print a green checkmark in its output:
col_green="\e[32;01m"
col_reset="\e[39;49;00m"
echo -e "Done ${col_green}✓${col_reset}"
After reading about Bash's ANSI-C Quoting, I realized I could use it when setting my color variables and remove the -e
flag from my echo.
col_green=$'\e[32;01m'
col_reset=$'\e[39;49;00m'
echo "Done ${col_green}✓${col_reset}"
This seems appealing, since it means the message prints correctly whether it's passed to Bash's builtin echo or the external util /bin/echo
(I'm on macOS).
But does this make the script less portable? I know Bash and Zsh support this style of quoting, but I'm not sure about others.
Best Answer
$'…'
is a ksh93 feature that is also present in zsh, bash, mksh, FreeBSD sh and in some builds of BusyBox sh (BusyBox ash built withENABLE_ASH_BASH_COMPAT
). It isn't present in the POSIX sh language yet. Common Bourne-like shells that don't have it include dash (which is/bin/sh
by default on Ubuntu among others), ksh88, the Bourne shell, NetBSD sh, yash, derivatives of pdksh other than mksh and some builds of BusyBox.A portable way to get backslash-letter and backslash-octal parsed as control characters is to use
printf
. It's present on all POSIX-compliant systems.Note that
\e
is not portable. It's supported by many implementations ofprintf
but not by the one in dash¹. Use the octal code instead.¹ It is supported in Debian and derivatives that ship at least 0.5.8-2.4, e.g. since Debian stretch and Ubuntu 17.04.