man printf.1
ma 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. dash
jest 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 printf
w dash
[1] nie koloruje wyjścia %s
, jeśli specyfikator formatu zawiera znak zmiany znaczenia ANSI \e
- ale specyfikator formatu %b
połą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, printf
aby 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 %b
formatu 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 %-6s
formatu z OP znajduje się w środku ciągu formatu między sekwencjami znaków sterujących otwierania i zamykania.
[1] Ref: man dash
Sekcja „Builtins” :: „printf” :: „Format”