man printf.1
має примітку внизу: "... у вашої оболонки може бути своя версія printf
...". Це запитання позначено bash
, але якщо це можливо, я намагаюся писати сценарії, що переносяться на будь-яку оболонку. dash
як правило, хороший мінімальний базовий рівень для портативності - так що відповідь тут працює bash
, dash
, &zsh
. Якщо сценарій працює в цих 3, його, швидше за все, можна переносити майже в будь-яке місце.
Остання реалізація printf
в dash
[1] не забарвлює вихідні дані %s
, задані специфікатором формату із символом виходу ANSI \e
- але специфікатор формату, %b
поєднаний з восьмеричною \033
(еквівалентно ASCII ESC
), виконає роботу. Будь ласка, коментуйте будь-які викиди, але AFAIK, всі оболонки реалізовані printf
для використання восьмеричного підмножини ASCII як мінімум.
До заголовка запитання "Використання кольорів із printf", найбільш портативний спосіб встановити форматування - поєднати %b
специфікатор формату для printf
(як зазначено у попередній відповіді @Vlad) із вісімковим екраном \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"
Виходи:
$ ./portable-color.sh
-> This is \033[1;34m blue \033[0m text
-> This is blue text
... а "синій" - синій у другому рядку.
Специфікатор %-6s
формату з OP знаходиться посередині рядка формату між послідовностями символів управління відкриттям і закриттям.
[1] Посилання: man dash
Розділ "Вбудовані" :: "printf" :: "Формат"