man printf.1tiene 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. dashes 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 printfen dash[1] no colorea la salida dado un %sespecificador de formato con un carácter de escape ANSI \e, pero un especificador de formato %bcombinado 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 printfpara 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 %bespecificador 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 %-6sespecificador 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 dashSección "Builtins" :: "printf" :: "Formato"