我有以下代码。
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 常见问题解答中被提及值得注意的是,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
以下是我测试过的所有三个终端的输出。
所以终端不支持除了8种基本颜色之外的颜色。为了安全和便携,请仅使用这 8 种颜色。