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) с восьмеричным escape-символом \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" :: "Формат"