Questo funziona per me:
printf "%b" "\e[1;34mThis is a blue text.\e[0m"
Da printf(1)
:
%b ARGUMENT as a string with '\' escapes interpreted, except that octal escapes are of the form \0 or \0NNN
Piuttosto che usare codici terminali arcaici, posso suggerire la seguente alternativa. Non solo fornisce un codice più leggibile, ma ti consente anche di mantenere le informazioni sul colore separate dagli identificatori di formato proprio come avevi originariamente previsto.
blue=$(tput setaf 4)
normal=$(tput sgr0)
printf "%40s\n" "${blue}This text is blue${normal}"
Vedi la mia risposta QUI per altri colori
Stai mescolando le parti insieme invece di separarle in modo netto.
printf '\e[1;34m%-6s\e[m' "This is text"
Fondamentalmente, metti le cose fisse nel formato e quelle variabili nei parametri.
Questo è un piccolo programma per ottenere colori diversi sul terminale.
#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;
}