Bashが色を印刷できるかどうかを確認する方法

Bashが色を印刷できるかどうかを確認する方法

私のプログラムが端末出力をカラーで出力できるかどうかを確認する方法があるかどうか疑問に思います。

次のコマンドを実行します。lessそして、カラー出力を使用するプログラムの出力を見ると、次のように出力が間違って表示されます。

[ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m]

答え1

アイデアは、プログラムが印刷できない場合に出力を色分けしないようにアプリケーションに通知することです。たとえば、cronジョブを介してファイルに出力を書き込むと、色付きの出力を書き込む必要はありませんが、手動で実行したときに見たいと思います。出力に色があります

申請書はどの言語で書かれますか?

一般的なアプローチは、出力デバイスが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ではより多くのタイピングが必要ですが、以下を使用すると同じ結果が得られます。イサティとにリストされている機能man 3 terminfo

答え2

これで十分です。

$ 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 はcolorsterminfo データベースにあるため、リクエストできます。終了ステータスが0の場合、termcapはコンパイルされます。しかし、次のようなものがある場合:

$ tput unknowntermcap
tput: unknown terminfo capability 'unknowntermcap'
$ echo $?
4

これはUnknowntermcapが存在しないことを示します。だからこれ:

$ tput colors
8
$ echo $?
0

あなたの注文が正しいことを示してください。

その他の便利な方法:

  • Cではただ使用できますイサティTTYであることを確認してください。
  • 愚かな端末であることを確認するには、$ TERM変数のように見えます。

乾杯

答え3

アイデアは、プログラムが印刷できない場合に出力を色分けしないようにアプリケーションに通知することです。たとえば、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);

答え4

lessANSIエスケープを解釈するように設定されていないエラーがあるためです。システムが端末が色を処理できることを知っていることを確認するには、サポートしている色のR数を出力します。色。 (一部の端末では、端末の説明として代わりに使用できますが、まだ色をサポートしています。)$LESSOPTStput colors-1xtermxterm-color

関連情報