man printf.1
tiene una nota en la parte inferior: "... su shell puede tener su propia versión de printf
...". Esta pregunta está etiquetada para bash
, pero si es posible, trato de escribir scripts portátiles para cualquier shell. dash
es por lo general una línea de base buena para la portabilidad mínimo - por lo que la respuesta aquí trabaja en bash
, dash
, y zsh
. Si un script funciona en esos 3, lo más probable es que sea portátil a cualquier lugar.
La última implementación de printf
en dash
[1] no colorea la salida dado un %s
especificador de formato con un carácter de escape ANSI \e
, pero un especificador de formato %b
combinado con octal \033
(equivalente a un ASCII ESC
) hará el trabajo. Por favor comente cualquier valor atípico, pero AFAIK, todos los shells se han implementado printf
para usar el subconjunto octal ASCII como mínimo.
Para el título de la pregunta "Usar colores con printf", la forma más portátil de configurar el formato es combinar el %b
especificador de formato para printf
(como se menciona en una respuesta anterior de @Vlad) con un escape octal \033
.
portable-color.sh
P="\033["
BLUE=34
printf "-> This is %s %-6s %s text \n" $P"1;"$BLUE"m" "blue" $P"0m"
printf "-> This is %b %-6s %b text \n" $P"1;"$BLUE"m" "blue" $P"0m"
Salidas:
$ ./portable-color.sh
-> This is \033[1;34m blue \033[0m text
-> This is blue text
... y 'azul' es azul en la segunda línea.
El %-6s
especificador de formato del OP está en el medio de la cadena de formato entre las secuencias de caracteres de control de apertura y cierre.
[1] Ref: man dash
Sección "Builtins" :: "printf" :: "Formato"