Esto funciona para mí:
printf "%b" "\e[1;34mThis is a blue text.\e[0m"
Desde printf(1)
:
%b ARGUMENT as a string with '\' escapes interpreted, except that octal escapes are of the form \0 or \0NNN
En lugar de usar códigos de terminal arcaicos, puedo sugerir la siguiente alternativa. No solo proporciona un código más legible, sino que también le permite mantener la información de color separada de los especificadores de formato, tal como pretendía originalmente.
blue=$(tput setaf 4)
normal=$(tput sgr0)
printf "%40s\n" "${blue}This text is blue${normal}"
Vea mi respuesta AQUÍ para colores adicionales
Estás mezclando las partes en lugar de separarlas limpiamente.
printf '\e[1;34m%-6s\e[m' "This is text"
Básicamente, coloque las cosas fijas en el formato y las cosas variables en los parámetros.
Este es un pequeño programa para obtener diferentes colores en la terminal.
#include <stdio.h>
#define KNRM "\x1B[0m"
#define KRED "\x1B[31m"
#define KGRN "\x1B[32m"
#define KYEL "\x1B[33m"
#define KBLU "\x1B[34m"
#define KMAG "\x1B[35m"
#define KCYN "\x1B[36m"
#define KWHT "\x1B[37m"
int main()
{
printf("%sred\n", KRED);
printf("%sgreen\n", KGRN);
printf("%syellow\n", KYEL);
printf("%sblue\n", KBLU);
printf("%smagenta\n", KMAG);
printf("%scyan\n", KCYN);
printf("%swhite\n", KWHT);
printf("%snormal\n", KNRM);
return 0;
}