man printf.1
имеет примечание внизу: "... ваша оболочка может иметь свою собственную версию printf
...".Этот вопрос помечен для bash
, но, если это вообще возможно, я пытаюсь написать сценарии, переносимые на любую оболочку.dash
обычно является хорошим минимальным базовым уровнем для переносимости - поэтому ответ здесь работает в bash
, dash
, & zsh
.Если сценарий работает в этих 3, он, скорее всего, переносим практически в любое место.
Последняя реализация printf
в dash
[1] не раскрашивает вывод, учитывая%s
спецификатор формата с управляющим символом ANSI \e
- , но спецификатор формата %b
в сочетании с восьмеричным \033
(эквивалент ASCII ESC
) выполнят работу.Пожалуйста, прокомментируйте любые выбросы, но AFAIK, во всех оболочках реализовано printf
для использования восьмеричного подмножества ASCII как минимум.
К названию вопроса "Использование цветов с printf" наиболее portable способ установить форматирование - объединить спецификатор формата %b
для printf
(как указано в предыдущем ответе из @Vlad) с восьмеричным экранированием \033
.
portable-color.sh
#/bin/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
Раздел "Builtins" :: "printf" :: "Format"