web-dev-qa-db-ja.com

ターミナルカラーエスケープシーケンスはbashのどこかに定義されていますか?

私はBashスクリプトで(主にCentOSで)色を頻繁に使用しましたが、その使用をより便利にするために、結局redefining変数を色の値にしています。

_local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"
_

またはtputも使用:

_bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`
_

_/etc/rc.d/init.d_ディレクトリの周りをgrepしましたが、そこに色の定義に関連するものは見つかりませんでした。

そのような定義はすでに存在していますか?そうでない場合は、たとえば、それらを_/etc/rc.d/init.d_のファイルに入れて、スクリプトに含めます。これは、_/etc/rc.d/init.d/functions_と少し似ています。

23
fduff

あなたが求めていることには、いくつかの側面があります。

まず、bashは色を定義しません。実際、bashには色が存在することさえまったくわかりません。知っているのは、あなたが_\033[0;36m_の文字を出力するように言ったことだけです。端末エミュレーター(xterm、gnome-terminalなど)は、これらの文字を受け取り、「シアンで出力を開始する必要がある」ことを理解します。

したがって、色を理解するのはターミナルエミュレータです。端末エミュレータは_\033[0;36m_がシアンであることを理解しますが、別の端末エミュレータはシアンにまったく異なる文字セットを使用する場合があります(ただし、正真正銘のターミナルエミュレータが標準を誇張してこれを行うことはありません)。これがtputの理由です。 _tput setaf 6_を実行すると、tputが端末のエスケープコードを色6(シアン)で検索し、そのエスケープコードを出力します。
(_tput setaf_コードの詳細については この質問 を参照)

ここでbashに戻ります。お気づきかもしれませんが、私がシアン色を参照しているとき、私は_\033[0;36m_ではなく_\[\033[0;36m\]_を使用しています。角かっこがありません。角括弧の目的は、プロンプトでエスケープコード(色)を使用するときに、bashがどの文字が表示されないかを知る必要があることです(ゼロ幅、実際には何も表示しません)。したがって、表示されない文字は_\[_ _\]_で囲みます。これらの文字を削除すると、最初はすべて正常に動作するように見えるかもしれませんが、コマンドが端末の幅を超えると、あらゆる種類の奇妙さに遭遇し始めます。これは、タイプするときに、bashがコマンドを次の行に折り返すタイミングを知っている必要があるためです。これを行うには、プロンプトの幅と、入力した幅の幅を計算します。

tputについての別の注記。 _CYAN="\[\033[0;36m\]"_はCYAN="$(tput setaf 6)"と同じnotです。先ほど説明したように、角括弧はbashに関連しており、tputはターミナルエスケープコードを出力するだけです。

角かっこは通常、プロンプトにのみ関連するため、スクリプトなどの出力で色を使用している場合は、使用しないでください。つまり、プロンプト以外に色を使用する場合は、複数の変数を定義する必要があります。 1つはプロンプトで使用するための角かっこ付き、もう1つはその他のすべてに使用します。プロンプトで色を参照するたびに、角かっこを手動で追加することもできます。

短い話ですが、おそらく次のようなものを定義する必要があります。

_local CYAN="$(tput setaf 6)" # OR CYAN="\033[0;36m"
local LIGHT_CYAN="$CYAN$(tput bold)" # OR LIGHT_CYAN="\033[1;36m"
local Prompt_CYAN="\[$CYAN\]"
local Prompt_LIGHT_CYAN="\[$LIGHT_CYAN\]"
_
38
Patrick

そのようなものが必要な場合は、~/.profileに行を追加してください:

GRAY="\[\033[1;30m\]"
LIGHT_GRAY="\[\033[0;37m\]"
CYAN="\[\033[0;36m\]"
LIGHT_CYAN="\[\033[1;36m\]"
NO_COLOUR="\[\033[0m\]"

または、オンデマンドでのみ使用する場合は、$HOMEのファイルに追加して、スクリプトでソースを提供します。

. ~/.mycolors

グローバルに利用できるようにするには、代わりに/etc/profileに追加します。いずれにせよ、この種のことは/etc/rc.d/init.dでのビジネスはまったくありません。そのディレクトリはinitデーモンの設定スクリプト用であり、シェル変数の設定とは何の関係もありません。

7
terdon