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

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

假设我的一个可移植 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是否可移植,如果不是,粗体文本的限制是什么?

感谢您的时间。

答案1

基本限制是转弯时大胆的 离开。部分终端支持ECMA-48控制SGR 22(既不粗体/微弱,也不影响颜色)。然而

  • terminfo 或 termcap 中没有预定义的粗体功能(请参阅手册页)。
  • 关闭粗体与关闭颜色之间也没有区别。

为了可移植性,您必须考虑到这一点(将颜色调回如果你变得大胆离开无意影响颜色)。

相关内容