追加読書

追加読書

次のコードがあります。

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

端末タイプを次のように構成する必要があります。puttyputty-256colorまたはputty-scoPuTTYまたはそれに基づくソフトウェア(例:MobaXTerm)を使用している場合。 terminfo データベースの唯一の項目である端末タイプPuTTYを正しく説明してください。

これは広く普及しています間違ったターミナルエミュレータはすべてXTermと互換性があり、terminfoデータベースのエントリとそのエントリがxterm正しく説明していると想定しています。xterm-256color

この誤った考えThomas DickeyのXTerm FAQで言及xtermそしてxterm-256color、アイテムが他の端末エミュレータだけでなくXTermのすべてのバージョンを説明しているわけではないことに注意する価値があります。

terminfoデータベースのエントリは、putty8つのECMA-48カラーのみをサポートする端末を記述します。実はxtermエントリーも同じだ。しかし、単に切り替えるxtermxterm-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つの端末すべての出力です。

  • Oracle Linuxデスクトップ環境 ここに画像の説明を入力してください。

  • WindowsのMobaXterm ここに画像の説明を入力してください。

  • Windowsのパテ ここに画像の説明を入力してください。

したがって、端末では8つの基本色以外にはサポートしていません。安全性と携帯性のために8つの色のみを使用してください。

関連情報