私のプログラムが色を使用して端末出力を出力できるかどうかを確認する方法があるかどうかを知りたいです。
のようなコマンドを実行less
し、色を使用して出力するプログラムからの出力を見ると、出力は次のように間違って表示されます。
[ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m]
ありがとう
私のプログラムが色を使用して端末出力を出力できるかどうかを確認する方法があるかどうかを知りたいです。
のようなコマンドを実行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
コマンドが正しいことを示します。
乾杯
colors
はtput
マニュアルページ(!)に記載されていません。そのため、stdoutで8以上の番号または0の戻りコードを探す必要がありますか?
colors
機能は、terminfo(5)に文書化されています。、、を使用したテストtput -T dumb colors
でtput -T vt220 colors
はtput -T linux colors
、tput -T xterm colors
一般的な値は-1
(色のサポートなし)および8
(8色)であることを示唆しています。これは、出力デバイスが端末([ -t 1 ]
またはisatty
)であることを確認した後にのみ適用されることに注意してください。
tput colors
ローカル端末データベースが端末について考えるものを返すことに注意してください。これは、特にxterm
多くのバリエーション(白黒から256色まで)が含まれているような端末タイプの場合、端末が実際にできることと一致しない場合があります。
私のアプリケーションは、プログラムが印刷できない場合に出力を色付けしないことをアプリケーションが知っていることです。たとえば、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
それは、less
ANSIエスケープを解釈するように設定されていないことの欠点です。探しR
の中で$LESSOPTS
。端末が色を処理できることをシステムが認識しtput colors
ているか-1
どうかの判断に関しては、サポートしている色の数を出力するか、色をサポートしていないかを出力します。(一部の端末では、端末の説明としてではxterm
なく、xterm-color
色をサポートしていることに注意してください。)
出力に色を追加したいが、色がサポートされている場合のみ、単に使用できますtput
。http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html