man printf.1hat unten einen Hinweis: "... Ihre Shell hat möglicherweise eine eigene Version von printf...". Diese Frage ist markiert bash, aber wenn möglich, versuche ich, Skripte zu schreiben, die auf eine beliebige Shell portierbar sind . dashin der Regel ist eine gute Mindeststandards für Portabilität - so die Antwort hier arbeitet bash, dash&zsh . Wenn ein Skript in diesen 3 funktioniert, ist es höchstwahrscheinlich auf nahezu jeden Ort portierbar.
Die neueste Implementierung der printfin dash[1] nicht kolorieren Ausgang ein bestimmter %sFormatspezifizierer mit einem ANSI - Escape - Zeichen \e- aber ein Spezifizierer Format %bmit Oktal kombiniert \033(entspricht einem ASCII ESC) wird den Job erledigen. Bitte kommentieren Sie alle Ausreißer, aber AFAIK, alle Shells wurden implementiert printf, um die oktale ASCII-Teilmenge mindestens zu verwenden.
Zum Titel der Frage "Verwenden von Farben mit printf" besteht die portabelste Methode zum Festlegen der Formatierung darin, den %bFormatbezeichner für printf(wie in einer früheren Antwort von @Vlad angegeben) mit einem oktalen Escapezeichen zu kombinieren \033.
portable-color.sh
#/bin/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"
Ausgänge:
$ ./portable-color.sh
-> This is \033[1;34m blue \033[0m text
-> This is blue text
... und 'blau' ist in der zweiten Zeile blau.
Der %-6sFormatbezeichner aus dem OP befindet sich in der Mitte der Formatzeichenfolge zwischen den Steuerzeichenfolgen zum Öffnen und Schließen.
[1] Ref: man dashAbschnitt "Builtins" :: "printf" :: "Format"