跳到主要内容
ansicode
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 —— 最便携
printf '\033[1;31m%s\033[0m %s\n' 'error:' 'permission denied'
使用 tput 颜色名 —— 感知 terminfo
RED=$(tput setaf 1)
BOLD=$(tput bold)
RESET=$(tput sgr0)

printf '%s%serror:%s permission denied\n' "$BOLD" "$RED" "$RESET"
Bash ANSI-C 引用($'...')—— 可读性最佳
red=$'\e[31m'
reset=$'\e[0m'
echo "${red}error${reset}: permission denied"
尊重 NO_COLOR
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"

相关序列

其他语言