プログラムが色を使用して端末出力を出力できるかどうかを確認する方法があるかどうかを知りたいです。
less
のようなコマンドを実行し、色を使用して出力するプログラムからの出力を見ると、出力は次のように間違って表示されます
[ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m]
ありがとう
アイデアは、アプリケーションが出力を色付けしないことを知っていることです。たとえば、プログラムが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 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 colors
はterminfoデータベースにあるため、要求することができます。終了ステータスがゼロの場合、termcapがコンパイルされます。ただし、次のようなものがある場合:
$ tput unknowntermcap
tput: unknown terminfo capability 'unknowntermcap'
$ echo $?
4
これは、unknowntermcapが存在しないことを示しています。したがって、この:
$ tput colors
8
$ echo $?
0
コマンドが正しかったことを示します。
乾杯
アイデアは、アプリケーションが出力を色付けしないことを知っていることです。たとえば、プログラムが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
これは、ANSIエスケープを解釈するように設定されていないless
の誤りです。 $LESSOPTS
でR
を探します。端末が色を処理できることをシステムが認識しているかどうかを判断する場合、tput colors
は、サポートする色の数を出力するか、色をサポートしない場合は-1
を出力します。 (一部の端末では、端末の説明としてxterm-color
ではなくxterm
を使用している場合がありますが、色はサポートされています。)
出力に色を追加したいが、色がサポートされている場合のみ、tput
を使用できます。 http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html