man printf.1ma na dole notatkę: „… Twoja powłoka może mieć własną wersję printf…”. To pytanie jest oznaczone jako bash, ale jeśli to możliwe, staram się pisać skrypty przenośne do dowolnej powłoki. dashjest zwykle dobrym minimalny bazowy do przenoszenia - więc odpowiedź tutaj pracuje bash, dash, i zsh. Jeśli skrypt działa w tych 3, najprawdopodobniej można go przenieść praktycznie wszędzie.
Najnowsza implementacja printfw dash[1] nie koloruje wyjścia %s, jeśli specyfikator formatu zawiera znak zmiany znaczenia ANSI \e- ale specyfikator formatu %bpołączony z ósemkowym \033(odpowiednik ASCII ESC) wykona zadanie. Proszę o komentarz dla wszelkich wartości odstających, ale AFAIK, wszystkie powłoki mają zaimplementowane, printfaby używać podzbioru ósemkowego ASCII jako minimum.
W tytule pytania „Używanie kolorów z printf” najbardziej przenośnym sposobem ustawiania formatowania jest połączenie specyfikatora %bformatu for printf(jak wspomniano we wcześniejszej odpowiedzi z @Vlad) z ósemkową ucieczką \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"
Wyjścia:
$ ./portable-color.sh
-> This is \033[1;34m blue \033[0m text
-> This is blue text
... a „niebieski” to niebieski w drugiej linii.
Specyfikator %-6sformatu z OP znajduje się w środku ciągu formatu między sekwencjami znaków sterujących otwierania i zamykania.
[1] Ref: man dashSekcja „Builtins” :: „printf” :: „Format”