프로그램에서 색상을 사용하여 터미널 출력을 출력 할 수 있는지 확인할 수있는 방법이 있는지 알고 싶습니다.
같은 명령을 실행 less
하고 색상을 사용하여 출력하는 프로그램의 출력을 보면 출력이 잘못 표시됩니다.
[ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m]
감사
프로그램에서 색상을 사용하여 터미널 출력을 출력 할 수 있는지 확인할 수있는 방법이 있는지 알고 싶습니다.
같은 명령을 실행 less
하고 색상을 사용하여 출력하는 프로그램의 출력을 보면 출력이 잘못 표시됩니다.
[ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m]
감사
답변:
아이디어는 프로그램이 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
.
이것으로 충분합니다 :
$ 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
당신의 명령이 옳았다는 것을 보여줍니다.
건배
colors
tput
맨 페이지 (!)에 문서화되어 있지 않으므로 stdout에서 숫자> = 8 또는 리턴 코드 0을 찾아야합니까?
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
) 인지 확인한 후에 만 적용됩니다 .
tput colors
로컬 터미널 데이터베이스가 터미널 어떻게 생각하는지 반환합니다. 이것은 실제로 터미널이 실제로 할 수있는 것과 일치하지 않을 수도 있습니다 xterm
.
아이디어는 프로그램이 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);
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
이는 less
ANSI 이스케이프를 해석하도록 설정되지 않은 결함 일 것입니다 . 를 찾을 R
에서 $LESSOPTS
. 시스템에서 터미널이 색상을 처리 할 수 있다는 것을 알고 있는지 여부는 tput colors
지원하는 색상 수를 지원하거나 -1
지원하지 않는 색상을 출력합니다. (일부 터미널은 터미널 설명 xterm
대신 사용할 수 xterm-color
있지만 여전히 색상을 지원합니다.)
출력에 색상을 추가하고 싶지만 색상이 지원되는 경우에만을 사용하면됩니다 tput
. http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html