Colorsterminfo/termcap
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
是否可移植,如果不是,粗體文本的限制是什麼?感謝您的時間。
基本限制是關閉粗體 時。一些終端支持 ECMA-48 控制SGR 22(既不加粗也不加淡,不影響顏色)。然而
- 在 terminfo 或 termcap 中沒有預定義的加粗功能(參見手冊頁)。
- 關閉粗體與關閉顏色之間也沒有區別。
為了便攜性,您必須考慮到這一點(如果您關閉粗體而不打算影響顏色,則重新打開顏色)。