シェルスクリプトができるだけ多くの端末をサポートできるようにします。つまり、サポートされている場合は、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