`tput`이 색상 지원을 감지하는 방법

`tput`이 색상 지원을 감지하는 방법

쉘 스크립트가 가능한 한 많은 터미널을 지원하도록 하려고 합니다. 즉, 지원되는 경우 ANSI 색상, 굵은 색상 및 어두운 색상만 추가합니다. 하지만 지원되는 색상의 수를 감지하고 싶습니다. 우리는 그것을 사용할 수 있습니다 tput colors.

그러나 일부 단순 시스템에는 이 기능이 설치되어 있지 않은 것으로 나타났습니다. 그래서 쉘에서 구현하고 싶습니다.

어떻게 tput colors작동하나요? tput colorsPOSIX 명령과 동등한 것이 있습니까 ? 도움과 답변 부탁드립니다.

답변1

tput쿼리는 터미널의 termcap 또는 terminfo 데이터베이스에 저장된 이름을 기반으로 합니다 $TERM.

tput표준 명령입니다clearinit, 그러나 , 및 reset(POSIX 로케일에서만) 이외의 함수 이름은 지정되지 않았습니다 .

일부 시스템에 가 없으면 tputterminfo 또는 termcap 데이터베이스가 없을 가능성이 높습니다.

또한 터미널 이름은 표준화되어 있지 않습니다.

예를 들어, API를 완전히 또는 올바르게 구현 하지 않았음에도 불구하고 $TERM으로 설정된 터미널이 많이 있으며, 다양한 버전이 있고 다양한 색상 수를 지원하도록 컴파일하거나 구성할 수 있지만 항상 그런 것은 아닙니다. 동일한 이스케이프 시퀀스를 사용하는 색상은 터미널마다 색상이 다르기 때문에 정확한 과학은 아닙니다 .xtermxtermxtermxterm$TERM

terminfo/termcap 데이터베이스가 없는 시스템에서는 자체 데이터베이스(가장 일반적으로 사용되는 터미널의 하위 집합과 관심 있는 기능만 포함)를 제공하고 스크립트에서 이를 쿼리하는 방법을 구현해야 합니다.

적어도 이것은 아마도 큰 사례 구성일 것입니다.

case $TERM in
  ( fbterm )
     colors=256
     fg_color() { printf '\33[1;%sd}' "$1"; }
     ;;
  ( *256color* | alacritty | i[tT]erm* )
     colors=256
     fg_color() {
       if [ "$1" -lt 8 ]; then
         printf '\33[3%sm' "$1"
       elif [ "$1" -lt 16 ]; then
         printf '\33[9%sm' "$(( $1 - 8 ))"
       else
         printf '\33[38;5;%sm' "$1"
       fi
     }
     # and so on.
esac

관련 정보