私はBashスクリプト(主にCentOS)で頻繁に色を使用しましたが、それらの使用をより便利にするために、再定義することになります。 色の値への変数:
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
のように、スクリプトに含めます。
承認された回答:
あなたが求めていることには、いくつかの側面があります。
まず、bashは色を定義しません。実際、bashは、色が存在することすらまったく認識していません。知っているのは、\033[0;36m
の文字を出力するように指示したことだけです。 。ターミナルエミュレータ(xterm、gnome-terminalなど)はこれらの文字を受け取り、「シアンで出力を開始する必要があります」と理解します。
したがって、色を理解するのはターミナルエミュレータです。ターミナルエミュレータは、\033[0;36m
はシアンですが、別のターミナルエミュレータは、シアンに対してまったく異なる文字セットを使用する場合があります(ただし、正常なターミナルエミュレータが標準を誇示してこれを行うことはありません)。これがtput
の理由です 。 tput setaf 6
を実行すると 、tput
は、端末のエスケープコードで色6(シアン)を検索し、そのエスケープコードを出力します。
さて、bashに戻りましょう。お気づきかもしれませんが、シアンの色について言及しているときは、\033[0;36m
を使用しています。 、\[\033[0;36m\]
ではありません 。角かっこがありません。角括弧の目的は、プロンプトでエスケープコード(色)を使用する場合、bashはどの文字が印刷されていないか(幅がゼロ、実際には何も表示されない)を認識しなければならないことです。したがって、印刷されない文字を\[
で囲みます \]
。これらの文字を削除すると、最初はすべてが正常に機能しているように見えるかもしれませんが、コマンドが端末の幅を超えると、あらゆる種類の奇妙なことに遭遇し始めます。これは、入力するときに、bashがコマンドを次の行に折り返すタイミングを認識している必要があるためです。これを行うために、プロンプトの幅を計算してから、入力した量の幅を計算します。
tput
についてのもう1つの注意 。 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\]"