`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

関連情報