Bash / shell
在 Bash / shell 中使用 ANSI 转义码
Bash 有两种可靠方式输出转义字节:printf 配合 \033 / \x1b(符合 POSIX,最便携);以及 tput(基于 terminfo,因为它适配 $TERM,最稳妥)。echo -e 在 bash 中可用但 dash / sh 不支持,可移植脚本应避免。字面 $'\e[...'(ANSI-C 引用)形式仅 bash/zsh 支持,但可读性极佳。
推荐库
- tput
ncurses 自带的命令:
tput setaf 1会根据当前$TERM输出红色前景转义。脚本如需兼容 dumb / 16 色 / 256 色终端,应该使用它。 - gum (charmbracelet)
预设样式的 shell 原语 ——
gum style、gum spin、gum choose、gum confirm。将 lipgloss / bubbletea 封装给 shell 脚本使用。 - dialog / whiptail
经典的全屏菜单 / 输入 / 进度对话框,基于 curses。
whiptail是更轻量、BSD 协议的克隆,随 Debian 一起发布。 - ncurses
C 库,但 bash 脚本可以调用与之同捆的
clear、reset、tput、infocmp等辅助程序。
常用写法
printf '\033[1;31m%s\033[0m %s\n' 'error:' 'permission denied'RED=$(tput setaf 1)
BOLD=$(tput bold)
RESET=$(tput sgr0)
printf '%s%serror:%s permission denied\n' "$BOLD" "$RED" "$RESET"red=$'\e[31m'
reset=$'\e[0m'
echo "${red}error${reset}: permission denied"if [ -t 1 ] && [ -z "${NO_COLOR:-}" ]; then
RED=$'\e[31m'; RESET=$'\e[0m'
else
RED=""; RESET=""
fi
printf '%serror:%s permission denied\n' "$RED" "$RESET"