쉘 스크립트가 가능한 한 많은 터미널을 지원하도록 하려고 합니다. 즉, 지원되는 경우 ANSI 색상, 굵은 색상 및 어두운 색상만 추가합니다. 하지만 지원되는 색상의 수를 감지하고 싶습니다. 우리는 그것을 사용할 수 있습니다 tput colors
.
그러나 일부 단순 시스템에는 이 기능이 설치되어 있지 않은 것으로 나타났습니다. 그래서 쉘에서 구현하고 싶습니다.
어떻게 tput colors
작동하나요? tput colors
POSIX 명령과 동등한 것이 있습니까 ? 도움과 답변 부탁드립니다.
답변1
tput
쿼리는 터미널의 termcap 또는 terminfo 데이터베이스에 저장된 이름을 기반으로 합니다 $TERM
.
tput
표준 명령입니다clear
init
, 그러나 , 및 reset
(POSIX 로케일에서만) 이외의 함수 이름은 지정되지 않았습니다 .
일부 시스템에 가 없으면 tput
terminfo 또는 termcap 데이터베이스가 없을 가능성이 높습니다.
또한 터미널 이름은 표준화되어 있지 않습니다.
예를 들어, API를 완전히 또는 올바르게 구현 하지 않았음에도 불구하고 $TERM
으로 설정된 터미널이 많이 있으며, 다양한 버전이 있고 다양한 색상 수를 지원하도록 컴파일하거나 구성할 수 있지만 항상 그런 것은 아닙니다. 동일한 이스케이프 시퀀스를 사용하는 색상은 터미널마다 색상이 다르기 때문에 정확한 과학은 아닙니다 .xterm
xterm
xterm
xterm
$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