man printf.1a une note en bas: "... votre shell peut avoir sa propre version de printf...". Cette question est balisée bash, mais si c'est possible, j'essaye d'écrire des scripts portables sur n'importe quel shell. dashest généralement une bonne base minimum pour la portabilité - donc la réponse fonctionne ici bash, dash, &zsh . Si un script fonctionne dans ces 3, il est très probable qu'il soit portable à peu près n'importe où.
La dernière implémentation de printfin dash[1] ne colorise pas la sortie étant donné un %sspécificateur de format avec un caractère d'échappement ANSI \e- mais, un spécificateur de format %bcombiné avec octal \033(équivalent à un ASCII ESC) fera le travail. Veuillez commenter les valeurs aberrantes, mais AFAIK, tous les shells ont été implémentés printfpour utiliser le sous-ensemble octal ASCII au strict minimum.
Au titre de la question "Utiliser les couleurs avec printf", le plus portable de définir le formatage est de combiner le %bspécificateur de format pour printf(comme indiqué dans une réponse précédente de @Vlad) avec un échappement 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"
Les sorties:
$ ./portable-color.sh
-> This is \033[1;34m blue \033[0m text
-> This is blue text
... et «bleu» est bleu sur la deuxième ligne.
Le %-6sspécificateur de format de l'OP se trouve au milieu de la chaîne de format entre les séquences de caractères de contrôle d'ouverture et de fermeture.
[1] Réf: man dashSection "Builtins" :: "printf" :: "Format"