man printf.1
hat 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 . dash
in 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 printf
in dash
[1] nicht kolorieren Ausgang ein bestimmter %s
Formatspezifizierer mit einem ANSI - Escape - Zeichen \e
- aber ein Spezifizierer Format %b
mit 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 %b
Formatbezeichner 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 %-6s
Formatbezeichner aus dem OP befindet sich in der Mitte der Formatzeichenfolge zwischen den Steuerzeichenfolgen zum Öffnen und Schließen.
[1] Ref: man dash
Abschnitt "Builtins" :: "printf" :: "Format"