[linux] printf에 색상 사용

다음과 같이 작성하면 텍스트가 파란색으로 출력됩니다.

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에서 작동한다면 거의 모든 곳으로 이식 가능합니다.

의 최신 구현 printfdash[1] 주어진 색상 화 출력되지 않습니다 %s은 ANSI 이스케이프 문자와 형식 지정자 \e하지만, 형식 지정자 %b진수와 결합 \033(아스키에 상응하는 ESC) 작업이 완료 얻을 것이다. 이상치에 대해서는 주석을 달았지만 AFAIK, 모든 쉘은 printf최소한 ASCII 8 진 서브 세트를 사용하도록 구현 되었습니다.

“printf와 함께 색상 사용”이라는 질문의 제목에 대해 형식 지정 을 설정 하는 가장 이식 가능한 방법 %bprintf( @Vlad 의 이전 답변 에서 참조한) 형식 지정자를 8 진수 이스케이프와 결합하는 것 \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

… 그리고 ‘파란색’은 두 번째 줄에서 파란색입니다.

%-6sOP 의 형식 지정자는 열기 및 닫기 제어 문자 시퀀스 사이의 형식 문자열 중간에 있습니다.



[1] 참조 : man dash섹션 “Builtins”:: “printf”:: “포맷”