Tengo un script de shell que utiliza lo siguiente para imprimir una marca de verificación verde en su salida:
col_green="\e[32;01m"
col_reset="\e[39;49;00m"
echo -e "Done ${col_green}✓${col_reset}"
Después de leer acerca de las citas ANSI-C de Bash , me di cuenta de que podía usarlo al configurar mis variables de color y eliminar la -e
bandera de mi eco .
col_green=$'\e[32;01m'
col_reset=$'\e[39;49;00m'
echo "Done ${col_green}✓${col_reset}"
Esto parece atractivo, ya que significa que el mensaje se imprime correctamente si se pasa al eco incorporado de Bash o al util externo /bin/echo
(estoy en macOS).
¿Pero esto hace que el script sea menos portátil? Sé que Bash y Zsh admiten este estilo de citas, pero no estoy seguro acerca de los demás.
Respuestas:
$'…'
es una característica de ksh93 que también está presente en zsh, bash, mksh, FreeBSD sh y en algunas compilaciones de BusyBox sh (BusyBox ash construido conENABLE_ASH_BASH_COMPAT
). Todavía no está presente en el lenguaje POSIX sh. Los shells comunes tipo Bourne que no lo tienen incluyen dash (que/bin/sh
por defecto está en Ubuntu entre otros), ksh88, el shell Bourne, NetBSD sh, yash, derivados de pdksh que no sean mksh y algunas compilaciones de BusyBox.Se debe utilizar una forma portátil de analizar la barra diagonal inversa y la barra diagonal inversa como caracteres de control
printf
. Está presente en todos los sistemas compatibles con POSIX.Tenga en cuenta que
\e
no es portátil. Es compatible con muchas implementaciones deprintf
pero no con la del tablero¹. Use el código octal en su lugar.Supported Es compatible con Debian y derivados que se envían al menos 0.5.8-2.4, por ejemplo, desde Debian stretch y Ubuntu 17.04.
fuente
\e
no ser admitidodash
?dash -c 'printf "\e[1;31m"; type printf; printf "\e[m"'
se imprimiráprintf is a shell builtin
en negrita aquí (guión-0.5.8). Un shell que no es compatible\e
esyash
.\e[1;31mprintf is a shell builtin \e[m
aquí. Ubuntu 16.04, guión 0.5.8-2.1ubuntu2. Imprime en rojo en Ubuntu 18.04 con el guión 0.5.8-2.10. Parece que Ubuntu hizo un parche para soportarlo.El grado de
$'...'
soporte también debe tenerse en cuenta al portar. La propuesta de la gente POSIX de poner esto en POSIX menciona una en particular:Por lo que obtuve aquí en mi diana de Debian, el
ksh2020
de AT&T entiende$'\U1F600'
. Este es el único shell Korn "oficial" que puedo obtener en esta nueva distribución.mksh
lo analizó pero lo estropeó por completo con un U + FFFE. Como no se quejó de un error de sintaxis, tiene que haber algo mal con su comprensión de Unicode. Se maneja$'\U01F60'
bien.fuente
$'...'
e iirc fue el primero que lo hizo.ksh2020
No es de AT&T. Un par de personas, una de Red Hat, esencialmente secuestró el árbol de github AST de AT&T hace unos años y reclamó el control delksh93
desarrollo futuro