次のコードがあります。
bold=''
reset=$(echo -en '\033[0m')
black=$(echo -en '\e[1;30m')
magenta=$(echo -en '\033[00;35m')
blue=$(echo -en '\e[1;34m')
cyan=$(echo -en '\e[1;36m')
green=$(echo -en '\e[1;32m')
orange=$(echo -en '\e[1;33m')
purple=$(echo -en '\e[1;35m')
red=$(echo -en '\e[1;31m')
white=$(echo -en '\e[1;37m')
yellow=$(echo -en '\e[1;33m')
lime_yellow=$(echo -en '\e[1;33m')
power_blue=$(echo -en '\e[1;34m')
blink=$(echo -en '\e[1;31m')
reverse=$(echo -en '\e[1;31m')
underline=$(echo -en '\e[1;31m')
if [ -x /usr/bin/tput ] && tput setaf 1 &>/dev/null; then
echo "tput color is supported."
tput sgr0 # Reset colors
bold=$(tput bold)
reset=$(tput sgr0)
black=$(tput setaf 0)
magenta=$(tput setaf 5)
blue=$(tput setaf 33)
cyan=$(tput setaf 37)
green=$(tput setaf 64)
orange=$(tput setaf 166)
purple=$(tput setaf 125)
red=$(tput setaf 124)
white=$(tput setaf 15)
yellow=$(tput setaf 136)
lime_yellow=$(tput setaf 190)
power_blue=$(tput setaf 153)
blink=$(tput blink)
reverse=$(tput smso)
underline=$(tput smul)
else
echo "tput color is not supported. Use old school colors."
fi
echo ${red}RED${green}GREEN${yellow}YELLOW${blue}BLUE${purple}PURPLE${cyan}CYAN${white}WHITE${reset}
tput
デフォルトでは、生成される色または古いエスケープ文字の2種類があります\e[1;32m
。たとえば、tput
ちらつきや下線をサポートする型がより興味深いので、コードはtput
可能であれば型の色を使用します。以下は、Oracle Linux 7.6(RedHatまたはCentOSと同様)のGUI環境で期待どおりに機能することを示すイメージです。
他の端末で実行すると動作しません。たとえば、以下はMobaXtermで実行されるスナップショットです。
私も試してみましたが、putty
やっぱりできませんね。私のコードに問題がありますか?
修正する
各端末で実行したecho $TERM
結果は以下の通りです。
デスクトップ環境のOracle Linux(カラー操作) 出力: xterm-256color WindowsのMobaXterm(色が機能しない) 出力:xterm WindowsのPutty(色が機能しない) 出力:xterm
答え1
端末タイプを次のように構成する必要があります。putty
、putty-256color
またはputty-sco
PuTTYまたはそれに基づくソフトウェア(例:MobaXTerm)を使用している場合。 terminfo データベースの唯一の項目である端末タイプPuTTYを正しく説明してください。。
これは広く普及しています間違ったターミナルエミュレータはすべてXTermと互換性があり、terminfoデータベースのエントリとそのエントリがxterm
正しく説明していると想定しています。xterm-256color
この誤った考えThomas DickeyのXTerm FAQで言及xterm
そしてxterm-256color
、アイテムが他の端末エミュレータだけでなくXTermのすべてのバージョンを説明しているわけではないことに注意する価値があります。
terminfoデータベースのエントリは、putty
8つのECMA-48カラーのみをサポートする端末を記述します。実はxterm
エントリーも同じだ。しかし、単に切り替えるxterm
とxterm-256colour
間違った。 PuTTYはXTermとは異なります。
実際、PuTTYはISO / IEC 8613制御シーケンスを使用して色(パレットの256色)を索引付けする機能が非常に優れています。実際、2017年からかなり能力ができました。直接ISO / IEC 8613制御シーケンスカラー(24ビットRGBカラー)を使用します。このputty-256colour
トピックでは、前者について説明します。 terminfoには後者を完全に説明する方法はありません。
使用正しい端末タイプをtput
検索して正しい制御順序。
追加読書
答え2
次のコードは機能します。
magenta=$(tput setaf 5)
blue=$(tput setaf 4)
cyan=$(tput setaf 6)
green="$(tput setaf 2)"
purple=$(tput setaf 5)
red=$(tput setaf 1)
white=$(tput setaf 7)
yellow=$(tput setaf 3)
答え3
これは端末の機能で、8つの基本色以外にはサポートしていません。利用可能なすべての色をテストするためにこのコードが見つかりました(出典:tput setafカラーテーブル?カラーコードを決定する方法は?):
# Connector fifos directory
read TMPDIR < <(mktemp -d /dev/shm/bc_shell_XXXXXXX)
fd=3
# find next free fd
nextFd() { while [ -e /dev/fd/$fd ];do ((fd++)) ;done;printf -v $1 %d $fd;}
tputConnector() {
mkfifo $TMPDIR/tput
nextFd TPUTIN
eval "exec $TPUTIN> >(LANG=C exec stdbuf -o0 tput -S - >$TMPDIR/tput 2>&1)"
nextFd TPUTOUT
eval "exec $TPUTOUT<$TMPDIR/tput"
}
myTput() { echo -e "$1\ncr" 1>&$TPUTIN && IFS= read -r -d $'\r' -u $TPUTOUT $2
}
tputConnector
myTput op op
myTput "setaf 7" grey
myTput "setaf 16" black
fore=("$black" "$grey")
for ((i=0; i<256; i++)) ;do
myTput "setab $i" bgr
printf " %s%s %3d %s" "$bgr" "${fore[ i>231 && i<244||(i<17)&& (i%8<2)||
(i>16&&i<232)&&((i-16)%6*11+(i-16)/6%6*14+(i-16)/36*10)<58
? 1 : 0 ]}" $i "$op"
(( ((i<16||i>231) && ((i+1)%8==0)) || ((i>16&&i<232)&& ((i-15)%6==0)) )) &&
printf "\n" ''
done
以下は、私がテストした3つの端末すべての出力です。
したがって、端末では8つの基本色以外にはサポートしていません。安全性と携帯性のために8つの色のみを使用してください。