bash에서 색상을 인쇄 할 수 있는지 확인하는 방법


62

프로그램에서 색상을 사용하여 터미널 출력을 출력 할 수 있는지 확인할 수있는 방법이 있는지 알고 싶습니다.

같은 명령을 실행 less하고 색상을 사용하여 출력하는 프로그램의 출력을 보면 출력이 잘못 표시됩니다.

[ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m]

감사



답변:


68

아이디어는 프로그램이 cron 작업을 통해 출력을 파일로 기록 할 수없는 경우 출력을 채색하지 말고 채색 된 출력을 로그 할 필요가 없지만 수동으로 실행할 때 보는 것을 좋아한다는 것입니다. 컬러 출력

어떤 언어로 응용 프로그램을 작성하고 있습니까?

일반적인 접근 방식은 출력 장치가 tty인지 확인하고 tty 인 경우 해당 유형의 터미널이 색상을 지원하는지 확인하는 것입니다.

bash모습은 다음과 같습니다.

# check if stdout is a terminal...
if test -t 1; then

    # see if it supports colors...
    ncolors=$(tput colors)

    if test -n "$ncolors" && test $ncolors -ge 8; then
        bold="$(tput bold)"
        underline="$(tput smul)"
        standout="$(tput smso)"
        normal="$(tput sgr0)"
        black="$(tput setaf 0)"
        red="$(tput setaf 1)"
        green="$(tput setaf 2)"
        yellow="$(tput setaf 3)"
        blue="$(tput setaf 4)"
        magenta="$(tput setaf 5)"
        cyan="$(tput setaf 6)"
        white="$(tput setaf 7)"
    fi
fi

echo "${red}error${normal}"
echo "${green}success${normal}"

echo "${green}0.052${normal} ${bold}${green}2,816.00 kb${normal}"
# etc.

C에서는 훨씬 더 타이핑해야하지만 isatty 와에 나열된 함수를 사용하여 동일한 결과를 얻을 수 있습니다 man 3 terminfo.


^^ that ^^ 내가 찾던 것과 정확히 일치 했습니다. 감사.
팀 케네디

tput에 대한 힌트를 주셔서 감사합니다. 이것은 정말 좋은 답변입니다.
AmadeusDrZaius

24

이것으로 충분합니다 :

$ tput colors

입력 색상 설명 :

맨 페이지를 보면 다음을 알 수 있습니다.

SYNOPSIS
       tput [-Ttype] capname [parms ... ]

과...

   capname
          indicates the capability from the terminfo database.  When term
          cap  support is compiled in, the termcap name for the capability
          is also accepted.

termcap colors은 terminfo 데이터베이스에 있으므로 요청할 수 있습니다. 종료 상태가 0이면 termcap이 컴파일됩니다. 그러나 다음과 같은 것이있는 경우 :

$ tput unknowntermcap
tput: unknown terminfo capability 'unknowntermcap'
$ echo $?
4

이것은 unknowntermcap이 존재하지 않음을 나타냅니다. 그래서 이건:

$ tput colors
8
$ echo $?
0

당신의 명령이 옳았다는 것을 보여줍니다.

다른 유용한 방법 :

  • C에서는 isatty를 사용 하고 TTY인지 확인할 수 있습니다.
  • $ TERM 변수를 찾는 멍청한 터미널인지 확인하십시오.

건배


colorstput맨 페이지 (!)에 문서화되어 있지 않으므로 stdout에서 숫자> = 8 또는 리턴 코드 0을 찾아야합니까?
l0b0

명백한 것처럼 보였지만 귀하의 의견에 따르면 그렇지 않습니다. 그 정보 (간단하게, 색상의 terminfo 데이터베이스의 기능입니다) 추가 해요
D4RIO

1
colors기능은 terminfo (5)에 문서화되어 있습니다. 사용 테스트 tput -T dumb colors, tput -T vt220 colors, tput -T linux colors, tput -T xterm colors공통의 가치가없는 제안 -1(더 컬러 지원) 및 8(8 색). 이는 출력 장치가 터미널 (예 : [ -t 1 ]또는 isatty) 인지 확인한 후에 만 ​​적용됩니다 .
Mikel

참고 tput colors로컬 터미널 데이터베이스가 터미널 어떻게 생각하는지 반환합니다. 이것은 실제로 터미널이 실제로 할 수있는 것과 일치하지 않을 수도 있습니다 xterm.
Gilles

7

아이디어는 프로그램이 cron 작업을 통해 출력을 파일로 기록 할 수없는 경우 출력을 채색하지 말고 채색 된 출력을 로그 할 필요가 없지만 수동으로 실행할 때 보는 것을 좋아한다는 것입니다. 컬러로 출력됩니다.

이 유스 케이스의 경우 일반적으로 프로그램이 수행하는 작업 (예 : GNU ls 또는 GNU grep with --color=auto)은 출력이 터미널로 갈 경우 색상을 사용하고 그렇지 않으면 색상을 사용하지 않는 것입니다. ANSI 색상 변경 시퀀스를 지원하지 않는 터미널은 사용자가 기본 선택을 무시할 수있을 정도로 드물다. 어쨌든 응용 프로그램에 색상을 강제로 켜거나 끄는 옵션이 있는지 확인하십시오.

쉘 스크립트에서 [ -t 1 ]표준 출력이 터미널인지 테스트 하는 데 사용하십시오 .

# option processing has set $color to yes, no or auto
if [ $color = auto ]; then
  if [ -t 1 ]; then color=yes; else color=no; fi
fi

C API를 사용하는 프로그램에서을 호출하십시오 isatty(1).

# option processing has set use_color to 0 for no, 1 for yes or 2 for auto
if (use_color == 2) use_color = isatty(1);

5

less와 같은 명령을 실행하고 색상을 사용하여 출력하는 프로그램의 출력을 보면 출력이 잘못 표시됩니다.

[ESC [0; 32m0.052ESC [0m ESC [1; 32m2,816.00 kbESC [0m])

를 사용해보십시오 less --RAW-CONTROL-CHARS.

이 예에서는 색상을 사용하여 출력을 인쇄 하는 logtool을 사용하고 있습니다.

--RAW-CONTROL-CHARS없이 :

$ head -20 /var/log/messages | logtool | less
ESC[0mESC[0;37mMar 20 11:43:52ESC[0mESC[1;36m host1ESC[0mESC[0;37m rsyslogd:ESC[0m ^GESC[0;31mlast message repeated 14 timesESC[0mESC[0m

--RAW-CONTROL-CHAR 사용 (이것이 예쁜 색상이라고 상상해보십시오. 또한 왜 ^G표시 되는지 잘 모르겠습니다 ).

$ head -20 /var/log/messages | logtool | less --RAW-CONTROL-CHARS
Mar 20 11:43:52 host1 rsyslogd: ^Glast message repeated 14 times

2

이는 lessANSI 이스케이프를 해석하도록 설정되지 않은 결함 일 것입니다 . 를 찾을 R에서 $LESSOPTS. 시스템에서 터미널이 색상을 처리 할 수 ​​있다는 것을 알고 있는지 여부는 tput colors지원하는 색상 수를 지원하거나 -1지원하지 않는 색상을 출력합니다. (일부 터미널은 터미널 설명 xterm대신 사용할 수 xterm-color있지만 여전히 색상을 지원합니다.)


아이디어는 프로그램이 cron 작업을 통해 출력을 파일로 기록 할 수없는 경우 출력을 채색하지 말고 채색 된 출력을 로그 할 필요가 없지만 수동으로 실행할 때 보는 것을 좋아한다는 것입니다. 컬러로 출력됩니다.
Angelo Vargas

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.