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


62

私のプログラムが色を使用して端末出力を出力できるかどうかを確認する方法があるかどうかを知りたいです。

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

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

ありがとう



回答:


68

私のアプリケーションは、プログラムが印刷できない場合に出力を色付けしないことをアプリケーションが知っていることです。たとえば、cronジョブを介してファイルに出力を記録し、色付きの出力を記録する必要はありませんが、手動で実行すると、表示したい色付きの出力

どの言語でアプリケーションを作成していますか?

通常のアプローチでは、出力デバイスがttyであるかどうかを確認し、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では、さらに多くの入力を行う必要がありますが、isattyとにリストされている関数を使用して同じ結果を得ることができますman 3 terminfo


^^それ^^はまさに私が探していたものでした。ありがとう。
ティムケネディ

tputに関するヒントをありがとう。これは本当に素晴らしい答えです。
AmadeusDrZaius

24

これで十分です:

$ tput colors

tputカラーの説明:

マンページを見ると、これに気づくでしょう:

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 colorsはterminfoデータベースにあるため、要求できます。終了ステータスがゼロの場合、termcapはコンパイルされます。しかし、次のようなものがある場合:

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

これは、unknowntermcapが存在しないことを示しています。したがって、この:

$ tput colors
8
$ echo $?
0

コマンドが正しいことを示します。

その他の便利な方法:

  • Cでは、isattyを使用して、TTYかどうかを確認できます。
  • $ TERM変数を探しているダム端末かどうかを確認する

乾杯


colorstputマニュアルページ(!)に記載されていません。そのため、stdoutで8以上の番号または0の戻りコードを探す必要がありますか?
-l0b0

明らかなように見えたが、あなたのコメントはそうではないことを示している。その情報を追加しています(簡単に言うと、色はterminfoデータベースの機能です)
D4RIO

1
このcolors機能は、terminfo(5)に文書化されています。、、を使用したテストtput -T dumb colorstput -T vt220 colorstput -T linux colorstput -T xterm colors一般的な値は-1(色のサポートなし)および8(8色)であることを示唆しています。これは、出力デバイスが端末([ -t 1 ]またはisatty)であることを確認した後にのみ適用されることに注意してください。
ミケル

tput colorsローカル端末データベースが端末について考えるものを返すことに注意してください。これは、特にxterm多くのバリエーション(白黒から256色まで)が含まれているような端末タイプの場合、端末が実際にできることと一致しない場合があります。
ジル「SO-悪であるのをやめる」

7

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

5

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

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

を使用してみてくださいless --RAW-CONTROL-CHARS

この例では、色を使用して出力を印刷するlogtoolを使用しています。

--RAW-CONTROL-CHARSなし:

$ head -20 /var/log/messages | logtool | less
ESC[0mESC[0;37mMar 20 11:43:52ESC[0mESC[1;36m host1ESC[0mESC[0;37m rsyslogd:ESC[0m ^GESC[0;31mlast message repeated 14 timesESC[0mESC[0m

--RAW-CONTROL-CHARを使用します(これがきれいな色であると想像してください。また、なぜ^G表示されているのかわかりません。):

$ head -20 /var/log/messages | logtool | less --RAW-CONTROL-CHARS
Mar 20 11:43:52 host1 rsyslogd: ^Glast message repeated 14 times

2

それは、lessANSIエスケープを解釈するように設定されていないことの欠点です。探しRの中で$LESSOPTS。端末が色を処理できることをシステムが認識しtput colorsているか-1どうかの判断に関しては、サポートしている色の数を出力するか、色をサポートしていないかを出力します。(一部の端末では、端末の説明としてではxtermなく、xterm-color色をサポートしていることに注意してください。)


私のアプリケーションは、プログラムが印刷できない場合に出力を色付けしないことをアプリケーションが知っている、たとえば、cronジョブを介してファイルに出力を記録し、色付きの出力を記録する必要はありませんが、手動で実行すると、表示したい色付きの出力。
アンジェロバルガス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.