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