Colors

terminfo/termcap tput bold/tput md:粗體文本的可移植性

  • February 12, 2022

假設我的一個攜帶式 shell 腳本中有以下顏色支持:

#!/bin/sh

set -o nounset

tput_init_linux () { set_fg_color='tput setaf'; reset_color=$(tput sgr0 2>/dev/null); }
tput_init_bsd   () { set_fg_color='tput AF';    reset_color=$(tput me 2>/dev/null);   }
tput_init_none  () { set_fg_color=':';          reset_color=;                         }

if tput setaf 1 >/dev/null 2>&1; then tput_init_linux || tput_init_none;
elif tput AF 1  >/dev/null 2>&1; then tput_init_bsd   || tput_init_none;
else tput_init_none; fi

no_color () { printf '%s' "$reset_color"; }

colorize ()
{
   #tput bold
   case "$1" in
       (red)     $set_fg_color 1 ;;
       (green)   $set_fg_color 2 ;;
       (yellow)  $set_fg_color 3 ;;
       (blue)    $set_fg_color 4 ;;
       (magenta) $set_fg_color 5 ;;
       (cyan)    $set_fg_color 6 ;;
       (white)   $set_fg_color 7 ;;
       (*) printf '%s\n' "[ERROR] This color ('$1') is not supported by the colorize() function. Quiting!" >&2; exit 1 ;;
   esac
}

print_ok     () { colorize green;  printf '%s' '[OK] ';        no_color; }
print_notice () { colorize cyan;   printf '%s' '[NOTICE] ';    no_color; }
print_debug  () { colorize yellow; printf '%s' '[DEBUG] ' >&2; no_color; }
print_error  () { colorize red;    printf '%s' '[ERROR] ' >&2; no_color; }

一個相當愚蠢的使用範例如下:

grub_config_file=/boot/grub/grub.cfg
readonly grub_config_file

if [ ! -f "$grub_config_file" ]; then
   print_error; printf '%s\n' "GRUB config file not found at $grub_config_file. Aborting!" >&2
   exit 1
else
   print_ok; printf '%s\n' "GRUB config file was found at $grub_config_file. Searching for Windows..."
fi

現在,我的問題是關於粗體文本

具體來說,我不確定 terminfo/termcap tput bold/tput md是否可移植,如果不是,粗體文本的限制是什麼?

感謝您的時間。

基本限制是關閉粗體 。一些終端支持 ECMA-48 控制SGR 22(既不加粗也不加淡,不影響顏色)。然而

  • 在 terminfo 或 termcap 中沒有預定義的加粗功能(參見手冊頁)。
  • 關閉粗體與關閉顏色之間也沒有區別。

為了便攜性,您必須考慮到這一點(如果您關閉粗體而不打算影響顏色,則重新打開顏色)

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