进一步阅读

进一步阅读

我有以下代码。

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生成的颜色或老式的转义字符,例如\e[1;32m.由于tput类型更有趣,例如它支持闪烁和下划线,因此代码tput如果可能的话使用类型颜色。这是一张图像,证明它在 Oracle Linux 7.6(有点像 RedHat 或 CentOS)GUI 环境中按预期工作。

在此输入图像描述

当我从其他终端运行它时,它不起作用。例如,下面是在 MobaXterm 中运行时的快照。

在此输入图像描述

我也尝试过putty,也是不行。我的代码有什么问题吗?


更新

echo $TERM在每个终端中执行,下面是结果。

具有桌面环境的 Oracle Linux(彩色作品)
输出:xterm-256color

Windows 上的 MobaXterm(颜色不起作用)
输出:xterm

Windows 上的腻子(颜色不起作用)
输出:xterm

答案1

您必须将终端类型配置为putty,putty-256color, 或者putty-sco使用 PuTTY 或基于它的软件(如 MobaXTerm)时。它们是 terminfo 数据库中唯一条目的终端类型正确描述 PuTTY

这是一种广泛传播的不正确假设终端仿真器都与 XTerm 兼容,并且terminfo 数据库中的xterm和条目正确地描述了它们。xterm-256color

这种错误的想法在 Thomas Dickey 的 XTerm 常见问题解答中被提及值得注意的是,xtermxterm-256color条目甚至没有描述 XTerm 的所有版本,更不用说其他终端仿真器了。

terminfo 数据库中的条目putty描述了仅支持 8 种 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

以下是我测试过的所有三个终端的输出。

  • Oracle Linux 桌面环境 在此输入图像描述

  • Windows 上的 MobaXterm 在此输入图像描述

  • Windows 上的腻子 在此输入图像描述

所以终端不支持除了8种基本颜色之外的颜色。为了安全和便携,请仅使用这 8 种颜色。

相关内容