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"