あなたが求めていることには、いくつかの側面があります。
まず、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はどの文字が印刷されていないか(幅0、実際には何も表示しない)を知る必要があることです。したがって、非印刷文字をで囲みます\[
\]
。これらの文字を削除すると、最初はすべて正常に動作するように見えますが、コマンドが端末の幅を超えると、あらゆる種類の奇妙な状態に陥り始めます。これは、入力時に、bashがコマンドを次の行にラップするタイミングを知る必要があるためです。これを行うには、プロンプトの幅を計算してから、入力した幅を計算します。
別のメモ、についてtput
。はと同じものでCYAN="\[\033[0;36m\]"
はありませんCYAN="$(tput setaf 6)"
。先ほど説明したように、角括弧は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\]"
\e[1;30m
、たとえば、技術的にはグレーを表すものではなく、むしろ端末によって通常グレーとして表示されるカラースロットではないためです。端末エミュレーターは、実際の表示色を自由に変更でき、多くの場合、ユーザーが構成可能なオプションにします。