Terminal

為什麼我的顏色沒有在所有終端中顯示?

  • January 8, 2020

我有以下一段程式碼。

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

這些程式碼應該可以工作:

   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)

您必須將您的終端類型配置為puttyputty-256color,或者putty-sco在使用 PuTTY 或基於它的東西(例如 MobaXTerm)時。它們是 terminfo 數據庫中的條目正確描述 PuTTY的唯一終端類型。

一個普遍的錯誤假設是終端仿真器都與 XTerm 兼容,並且 terminfo 數據庫中的xtermxterm-256color條目正確地描述了它們。

這種錯誤想法在 Thomas Dickey 的 XTerm FAQ 中被指出,值得注意的是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會查找正確的控制序列。

進一步閱讀

引用自:https://unix.stackexchange.com/questions/560974