web-dev-qa-db-ja.com

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

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

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

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

ありがとう

64
Angelo Vargas

アイデアは、アプリケーションが出力を色付けしないことを知っていることです。たとえば、プログラムが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では、さらに多くのタイピングを行う必要がありますが、 isattyman 3 terminfoにリストされている関数を使用して同じ結果を得ることができます。

71
Mikel

これで十分です:

$ 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変数を探しているダム端末であるかどうかを確認します

乾杯

25
D4RIO

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

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
5

これは、ANSIエスケープを解釈するように設定されていないlessの誤りです。 $LESSOPTSRを探します。端末が色を処理できることをシステムが認識しているかどうかを判断する場合、tput colorsは、サポートする色の数を出力するか、色をサポートしない場合は-1を出力します。 (一部の端末では、端末の説明としてxterm-colorではなくxtermを使用している場合がありますが、色はサポートされています。)

3
geekosaur

出力に色を追加したいが、色がサポートされている場合のみ、tputを使用できます。 http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html

1
Šimon Tóth