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

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

私は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`

ディレクトリをgrepしましたが、/etc/rc.d/init.d色の定義に関する内容が見つかりませんでした。

すでにそのような定義がありますか?それ以外の場合は、ファイルに入れて/etc/rc.d/init.dスクリプトに含めます。/etc/rc.d/init.d/functions

答え1

あなたが要求する内容にはいくつかの側面があります。

まず、bashは色を定義しません。実際、bashは色が存在するという事実を全く知りません。それはあなたが文字を出力するように指示することだけを知っています\033[0;36m。ターミナルエミュレータ(xterm、gnome-terminalなど)はこれらの文字を受け取り、「ターコイズで出力を開始する必要があります」を理解します。

したがって、端末エミュレータは色を理解します。ターミナルエミュレータは\033[0;36mターコイズを認識しますが、他のターミナルエミュレータはまったく異なるターコイズ文字セットを使用できます(通常のターミナルエミュレータは標準を宣伝し、それを実行しません)。だからtput。を実行すると、tput setaf 6ターミナルtputのエスケープコードで色6(ターコイズ)を見つけて対応するエスケープコードを出力します。
(望むよりこの問題tput setafコードの詳細)

これでb​​ashに戻ります。私がターコイズに言及したときは、常に\033[0;36m代わりにを使用することに気づきました\[\033[0;36m\]。角かっこがありません。角かっこの目的は、プロンプトでエスケープコード(色)を使用するときにbashがどの文字が印刷されないか(幅が0で、実際には何も表示しない)を知る必要があることです。したがって、印刷されない文字を束ねます\[ \]。これらの文字を削除すると、最初はすべてがうまく動作するように見えますが、コマンドが端末の幅を超えると、あらゆる種類の奇妙なことが発生し始めます。これは、入力時にコマンドが次の行に進むべき時期をbashが知る必要があるためです。これを行うには、プロンプトの幅を計算し、入力幅を計算します。

tput.isCYAN="\[\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\]"

関連情報