man printf.1
a 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. dash
est 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 printf
in dash
[1] ne colorise pas la sortie étant donné un %s
spécificateur de format avec un caractère d'échappement ANSI \e
- mais, un spécificateur de format %b
combiné 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 printf
pour 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 %b
spé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 %-6s
spé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 dash
Section "Builtins" :: "printf" :: "Format"