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" :: "Формат"