man printf.1
ha una nota in fondo: "... la tua shell potrebbe avere la sua versione di printf
...". Questa domanda è contrassegnata bash
, ma se possibile, cerco di scrivere script portabili su qualsiasi shell. dash
è di solito una linea di base minima buona per la portabilità - quindi la risposta qui lavora in bash
, dash
, & zsh
. Se uno script funziona in quei 3, è molto probabilmente portabile praticamente ovunque.
L'ultima implementazione di printf
a dash
[1] non uscita Colorize dato un %s
identificatore di formato con un carattere di escape ANSI \e
- ma, un identificatore di formato %b
combinato con ottale \033
(equivalente a un ASCII ESC
) otterrà il lavoro fatto. Si prega di commentare per eventuali valori anomali, ma AFAIK, tutte le shell sono state implementate printf
per utilizzare il sottoinsieme ottale ASCII come minimo.
Al titolo della domanda "Usare i colori con printf", il modo più portabile per impostare la formattazione è combinare l' identificatore di %b
formato per printf
(come indicato in una risposta precedente da @Vlad) con un escape ottale \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"
Uscite:
$ ./portable-color.sh
-> This is \033[1;34m blue \033[0m text
-> This is blue text
... e "blu" è blu nella seconda riga.
L' %-6s
identificatore di formato dall'OP si trova al centro della stringa di formato tra le sequenze di caratteri di controllo di apertura e chiusura.
[1] Rif: man dash
Sezione "Builtins" :: "printf" :: "Format"
printf
consiste in una stringa di formato e un elenco di argomenti che vengono stampati in base al formato. Dovresti vedere i colori come parte della stringa di formato e quindi dovrebbero appartenere alla stringa di formato.