Ответ 1
Вы смешиваете детали вместе, а не разделяете их чисто.
printf '\e[1;34m%-6s\e[m' "This is text"
В принципе, поставьте фиксированные данные в формате и переменную в параметрах.
При написании такого текста он выводит текст синим цветом:
printf "\e[1;34mThis is a blue text.\e[0m"
Но я хочу иметь формат, определенный в printf:
printf '%-6s' "This is text"
Теперь я попробовал несколько опций, как добавить цвет, без успеха:
printf '%-6s' "\e[1;34mThis is text\e[0m"
Я даже пытался добавить код атрибута в формат без успеха. Это не работает, и я не могу найти нигде пример, где цвета добавляются в printf, который имеет формат, как в моем случае.
Вы смешиваете детали вместе, а не разделяете их чисто.
printf '\e[1;34m%-6s\e[m' "This is text"
В принципе, поставьте фиксированные данные в формате и переменную в параметрах.
Вместо использования архаичных терминальных кодов я могу предложить следующую альтернативу. Он не только обеспечивает более читаемый код, но также позволяет сохранять информацию о цвете отдельно от спецификаторов формата так, как вы изначально планировали.
blue=$(tput setaf 4)
normal=$(tput sgr0)
printf "%40s\n" "${blue}This text is blue${normal}"
Смотрите мой ответ ЗДЕСЬ для дополнительных цветов
Это работает для меня:
printf "%b" "\e[1;34mThis is a blue text.\e[0m"
От printf(1)
:
%b ARGUMENT as a string with '\' escapes interpreted, except that octal escapes are of the form \0 or \0NNN
Это небольшая программа для получения другого цвета на терминале.
#include <stdio.h>
#define KNRM "\x1B[0m"
#define KRED "\x1B[31m"
#define KGRN "\x1B[32m"
#define KYEL "\x1B[33m"
#define KBLU "\x1B[34m"
#define KMAG "\x1B[35m"
#define KCYN "\x1B[36m"
#define KWHT "\x1B[37m"
int main()
{
printf("%sred\n", KRED);
printf("%sgreen\n", KGRN);
printf("%syellow\n", KYEL);
printf("%sblue\n", KBLU);
printf("%smagenta\n", KMAG);
printf("%scyan\n", KCYN);
printf("%swhite\n", KWHT);
printf("%snormal\n", KNRM);
return 0;
}
Это небольшая функция, которая печатает цветной текст с использованием bash сценариев. Вы можете добавить столько стилей, сколько хотите, и даже распечатать вкладки и новые строки:
#!/bin/bash
# prints colored text
print_style () {
if [ "$2" == "info" ] ; then
COLOR="96m";
elif [ "$2" == "success" ] ; then
COLOR="92m";
elif [ "$2" == "warning" ] ; then
COLOR="93m";
elif [ "$2" == "danger" ] ; then
COLOR="91m";
else #default color
COLOR="0m";
fi
STARTCOLOR="\e[$COLOR";
ENDCOLOR="\e[0m";
printf "$STARTCOLOR%b$ENDCOLOR" "$1";
}
print_style "This is a green text " "success";
print_style "This is a yellow text " "warning";
print_style "This is a light blue with a \t tab " "info";
print_style "This is a red text with a \n new line " "danger";
print_style "This has no color";
Я использую этот код c для печати цветного вывода оболочки. Код основан на этом посте.
//General Formatting
#define GEN_FORMAT_RESET "0"
#define GEN_FORMAT_BRIGHT "1"
#define GEN_FORMAT_DIM "2"
#define GEN_FORMAT_UNDERSCORE "3"
#define GEN_FORMAT_BLINK "4"
#define GEN_FORMAT_REVERSE "5"
#define GEN_FORMAT_HIDDEN "6"
//Foreground Colors
#define FOREGROUND_COL_BLACK "30"
#define FOREGROUND_COL_RED "31"
#define FOREGROUND_COL_GREEN "32"
#define FOREGROUND_COL_YELLOW "33"
#define FOREGROUND_COL_BLUE "34"
#define FOREGROUND_COL_MAGENTA "35"
#define FOREGROUND_COL_CYAN "36"
#define FOREGROUND_COL_WHITE "37"
//Background Colors
#define BACKGROUND_COL_BLACK "40"
#define BACKGROUND_COL_RED "41"
#define BACKGROUND_COL_GREEN "42"
#define BACKGROUND_COL_YELLOW "43"
#define BACKGROUND_COL_BLUE "44"
#define BACKGROUND_COL_MAGENTA "45"
#define BACKGROUND_COL_CYAN "46"
#define BACKGROUND_COL_WHITE "47"
#define SHELL_COLOR_ESCAPE_SEQ(X) "\x1b["X"m"
#define SHELL_FORMAT_RESET ANSI_COLOR_ESCAPE_SEQ(GEN_FORMAT_RESET)
int main(int argc, char* argv[])
{
//The long way
fputs(SHELL_COLOR_ESCAPE_SEQ(GEN_FORMAT_DIM";"FOREGROUND_COL_YELLOW), stdout);
fputs("Text in gold\n", stdout);
fputs(SHELL_FORMAT_RESET, stdout);
fputs("Text in default color\n", stdout);
//The short way
fputs(SHELL_COLOR_ESCAPE_SEQ(GEN_FORMAT_DIM";"FOREGROUND_COL_YELLOW)"Text in gold\n"SHELL_FORMAT_RESET"Text in default color\n", stdout);
return 0;
}
man printf.1
есть примечание: "... ваша оболочка может иметь свою собственную версию printf
...". Этот вопрос помечен для bash
, но, если это вообще возможно, я пытаюсь написать сценарии, переносимые на любую оболочку. dash
как правило, является хорошей минимальной базой для переносимости, поэтому ответ здесь работает в bash
, dash
и & zsh
. Если сценарий работает в этих 3, он, скорее всего, переносим практически в любом месте.
Последняя реализация printf
в dash
[1] не раскрашивает вывод, учитывая спецификатор формата %s
с escape-символом ANSI \e
но спецификатор формата %b
сочетании с восьмеричным \033
(эквивалент ASCII ESC
) будет справиться с работой. Пожалуйста, прокомментируйте любые выбросы, но, AFAIK, во всех оболочках реализован printf
для использования восьмеричного подмножества ASCII на минимальном уровне.
К названию вопроса "Использование цветов с printf" наиболее переносимый способ задать форматирование - это объединить спецификатор формата %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
формата %-6s
из OP находится в середине строки формата между последовательностями управляющих символов открытия и закрытия.
[1] Ссылка: man dash
Раздел "Builtins" :: "printf" :: "Format"
#include <stdio.h>
//fonts color
#define FBLACK "\033[30;"
#define FRED "\033[31;"
#define FGREEN "\033[32;"
#define FYELLOW "\033[33;"
#define FBLUE "\033[34;"
#define FPURPLE "\033[35;"
#define D_FGREEN "\033[6;"
#define FWHITE "\033[7;"
#define FCYAN "\x1b[36m"
//background color
#define BBLACK "40m"
#define BRED "41m"
#define BGREEN "42m"
#define BYELLOW "43m"
#define BBLUE "44m"
#define BPURPLE "45m"
#define D_BGREEN "46m"
#define BWHITE "47m"
//end color
#define NONE "\033[0m"
int main(int argc, char *argv[])
{
printf(D_FGREEN BBLUE"Change color!\n"NONE);
return 0;
}