终端中的彩色输出
创建此页面旨在整合 CLI 输出的配色方案。
背景
转义序列
ANSI 转义序列定义了一种在终端输出中加入额外信息的方法,而颜色正是这些“额外信息”的一部分。多年来,终端颜色的范围得到了极大的扩展,从最初的 8 色发展到了完整的 24 位真彩色。
基础颜色编码提供了 8 种正常亮度的颜色和 8 种更亮的对应颜色。现代终端模拟器(包括 Linux 控制台本身)允许您指定颜色所对应的精确 RGB 值。几乎所有的终端模拟器都支持此模式。
随着 256 色显示技术的出现,产生了 256 色转义码。这 256 种颜色包含 16 种基础颜色、216 种 RGB 颜色(以 6x6x6 立方体排列)以及 24 个灰度等级。除了前 16 种颜色外,该方案通常无法自定义,因为它与 RGB 有着明确的映射关系。大多数终端模拟器都支持此模式。(少数模拟器使用类似但不兼容的 88 色编码。在实践中您几乎不会用到它们,但在 terminfo 数据库中可能会看到它们。)
真彩色(Truecolor)模式的支持度较低,它允许使用 1670 万种 (224) RGB 颜色(每个分量范围从 0 到 255)。
Termcap 和 terminfo
Termcap 和 terminfo 是 ncurses 的一部分,它们是存储终端(通常由 TERM 环境变量指定)所能识别的转义序列信息的数据库。tput(1) 和 infocmp(1) 命令可用于在命令行访问它们。
应用程序
diff
从 3.4 版本开始,diffutils 包含了 --color 选项(GNU 邮件列表)。
$ alias diff='diff --color=auto'
grep
--color=auto 选项启用颜色高亮显示。颜色代码仅在标准输出时发出;在管道或重定向时则不会。
grep 的彩色输出在处理 正则表达式 任务时非常有用。
使用 别名(alias) 可永久启用此选项。
alias grep='grep --color=auto'
GREP_COLORS 变量用于定义颜色,它配置了高亮的各个部分。要更改颜色,请找到所需的 ANSI 转义序列 并应用它。更多信息请参阅 grep(1) § GREP COLORS。
-n 选项会在输出中包含文件行号。
less
环境变量
我们可以通过 --RAW-CONTROL-CHARS 和 --color/-D 参数告诉 less 在显示加粗文字或其他格式效果时使用颜色。我们也可以添加 --use-color 来启用 less 用户界面的配色。
例如,将 LESS 环境变量 设置为 --RAW-CONTROL-CHARS --use-color -Dd+r -Du+b,将使加粗文字显示为红色,下划线文字显示为蓝色。
更多信息,请参见 less(1) § D 或 [1]。
从标准输入读取
当您运行命令并通过管道将其 标准输出 (stdout) 传给 less 进行分页查看(例如 pacman -Qe | less)时,您可能会发现输出不再有颜色。这通常是因为程序会尝试检测其 stdout 是否为交互式终端,如果是,它会打印带颜色的文本,否则打印不带颜色的文本。当您想将 stdout 重定向到文件(例如 pacman -Qe > pkglst-backup.txt)时,这是一种很好的行为,但在想要在 less 中查看输出时却不那么适用。
一些程序提供了禁用交互式 tty 检测的选项。
# dmesg --color=always | less
如果程序没有提供类似的选项,可以使用以下工具欺骗程序,使其认为其 stdout 是一个交互式终端:
- ColorThis — 通过在 pty 中运行程序来强制输出颜色,支持转发 stdin。
- stdoutisatty — 一个小程序和支持
LD_PRELOAD的库,用于拦截 isatty(3) 函数调用。
- https://github.com/lilydjwg/stdoutisatty || stdoutisatty
- 示例:
stdoutisatty 程序名 | less
- unbuffer — 随 expect 提供的 tclsh 脚本,它在 pty 中调用所需的程序。
- unbuffer(1) || expect
- 示例:
unbuffer 程序名 | less
~/.zshrc
zmodload zsh/zpty
pty() {
zpty pty-${UID} ${1+$@}
if [[ ! -t 1 ]];then
setopt local_traps
trap '' INT
fi
zpty -r pty-${UID}
zpty -d pty-${UID}
}
ptyless() {
pty $@ | less
}
用法
$ ptyless program
将其通过管道传给其他分页器(本例中为 less)
$ pty program | less
ls
--color=auto 选项启用颜色高亮显示。颜色代码仅在标准输出时发出;在管道或重定向时则不会。
使用 别名(alias) 可永久启用此选项。
alias ls='ls --color=auto'
LS_COLORS 变量用于定义颜色,并配置高亮的各个部分。使用 dircolors(1) 命令进行设置。
随许多主题一同分发的 vivid 是 dircolors 的一个高级替代品,请参阅 vivid --help 查看用法。
--color 选项可能会导致明显的性能损耗。默认设置要求 ls 对其列出的每一个文件运行 stat(1)。但是,如果您想要大部分的文件类型着色,但可以舍弃其他着色选项(如可执行文件、孤立链接、粘滞位、其他用户可写、能力属性),请使用 dircolors 设置 LS_COLORS 环境变量如下:eval $(dircolors -p | perl -pe 's/^((CAP|S[ET]|O[TR]|M|E)\w+).*/$1 00/' | dircolors -)
更多信息请参阅 ls(1)。
man
grotty(1)(man 默认使用的后处理器)确实有颜色功能,但强烈不建议将其用于 man 手册页。下方的大多数选项是通过用包含颜色的变体序列替换加粗、突出和下划线的序列来伪造彩色手册页。
使用 less
首先,执行以下二者之一:
- 全局启用 less 中的配色,如 #less 所示。
- 仅在查看 man 时启用 less 配色,通过将
MANPAGER环境变量 设置为(例如)less --use-color -Dd+r -Du+b。由于下述选项,无需--RAW-CONTROL-CHARS选项。
然后,您需要禁用 grotty(1) 后处理器中的 SGR/OSC 转义序列,因为它们不能与 less 一起使用。[3] 这是通过 nroff(1) 的 -P 选项传递的,您可以通过设置 MANROFFOPT 环境变量为 -P -c 来应用此选项。
使用 most
'most' 的基本功能类似于 less 和 more,但功能集较小。配置 most 使用颜色比使用 less 更容易,但需要额外的配置来使其表现得像 less。安装 most 软件包。
编辑 /etc/man_db.conf,取消对 pager 定义的注释并将其更改为:
DEFINE pager most -s
通过键入以下内容测试新设置:
$ man whatever_man_page
修改颜色值需要编辑 ~/.mostrc(如果不存在则创建该文件)或编辑 /etc/most.conf 以进行全局修改。示例 ~/.mostrc:
% Color settings color normal lightgray black color status yellow blue color underline yellow black color overstrike brightblue black
使用 bat
bat 可以用作 man 的彩色分页器,通过设置 MANPAGER 环境变量,如文档所述。
使用 X 资源
在 xterm/uxterm 或 rxvt-unicode 上为查看的手册页添加颜色的一种快捷方法是修改 ~/.Xresources。
xterm
*VT100.colorBDMode: true *VT100.colorBD: red *VT100.colorULMode: true *VT100.colorUL: cyan
这会用颜色替换装饰。如果想在同时使用颜色和装饰(加粗或下划线),请额外添加:
*VT100.veryBoldColors: 6
更多信息请参见 xterm(1) § veryBoldColors。
rxvt-unicode
URxvt.colorIT: #87af5f URxvt.colorBD: #d7d7d7 URxvt.colorUL: #87afd7
运行
$ xrdb -load ~/.Xresources
启动一个新的 xterm/uxterm 或 rxvt-unicode,您应该能看到彩色的手册页。
这种组合在 xterm/uxterm 中将颜色应用于加粗和下划线单词,或在 rxvt-unicode 中应用于加粗、下划线和斜体文字。您可以尝试这些属性的不同组合。请参阅该项目的源码(已归档)。
pacman
Pacman 有一个颜色选项。取消 /etc/pacman.conf 中 Color 行的注释即可。
封装器
通用封装器
(大多数已过时,但仍可工作)
它们带有多个预配置的预设,可以更改,也可以创建/贡献新的预设。
- rainbow — 使用模式为命令输出或标准输入着色。
预设:df, diff, env, host, ifconfig, java-stack-trace, jboss, jonas, md5sum, mvn2, mvn3, ping, tomcat, top, traceroute。
- grc — 另一个用于美化日志文件或命令输出的着色器。
预设:cat, cvs, df, diff, dig, gcc, g++, ls, ifconfig, make, mount, mtr, netstat, ping, ps, tail, traceroute, wdiff, blkid, du, dnf, docker, docker-machine, env, id, ip, iostat, last, lsattr, lsblk, lspci, lsmod, lsof, getfacl, getsebool, ulimit, uptime, nmap, fdisk, findmnt, free, semanage, sar, ss, sysctl, systemctl, stat, showmount, tune2fs 和 tcpdump。
- cope — 终端程序的彩色封装器。
预设:acpi, arp, cc, df, dprofpp, fdisk, free, g++, gcc, id, ifconfig, ls, lspci, lsusb, make, md5sum, mpc, netstat, nm, nmap, nocope, ping, pmap, ps, readelf, route, screen, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, shasum, socklist, stat, strace, tcpdump, tracepath, traceroute, w, wget, who, xrandr。
- cw — 一个非侵入式的、针对常见 Unix 命令的实时 ANSI 彩色封装器。封装了 file,这可能会引起一些问题。
预设:arp, arping, auth.log@, blockdev, cal, cksum, clock, configure, cpuinfo@, crontab@, cw-pipe, cw-test.cgi, date, df, diff, dig, dmesg, du, env, figlet, file, find, finger, free, fstab@, fuser, g++, gcc, group@, groups, hdparm, hexdump, host, hosts@, id, ifconfig, inittab@, iptables, last, lastlog, lsattr, lsmod, lsof, ltrace-color, make, md5sum, meminfo@, messages@, mount, mpg123, netstat, nfsstat, nmap, nslookup, objdump, passwd@, ping, pmap, pmap_dump, praliases, profile@, protocols@, ps, pstree, quota, quotastats, resolv.conf@, route, routel, sdiff, services@, showmount, smbstatus, stat, strace-color, sysctl, syslog, tar, tcpdump, tracepath, traceroute, umount, uname, uptime, users, vmstat, w, wc, whereis, who, xferlog。
- ccze — 一个用 C 编写的快速日志着色器,旨在作为 colorize 的直接替代品。
用于输出着色的库
- libtextstyle — 一个用于设置终端文本输出样式的 C 库。
- ruby-rainbow — Rainbow 是 Ruby String 类的扩展,增加了在 ANSI 终端上对文本着色的支持。
- python-blessings — 一个轻量级、实用的终端着色、样式设置和定位封装器。
- lolcat — 让输出像彩虹一样多彩的 Ruby 程序。
特定应用程序
编译器
- colorgcc — 一个 Perl 封装器,用于根据 gcc 输出格式匹配警告/错误消息并对编译器输出进行着色。
diff
Diff 有 内置的彩色输出,建议使用。但也可以使用以下封装器:
- colordiff — 用于 diff 高亮的 Perl 脚本。
- cwdiff — 支持目录和高亮的 (w)diff 封装器。
- git-delta — 用于 git 和 diff 输出的语法高亮分页器。
cat
- bat — 带有语法高亮和 git 集成的 cat 克隆。
less
source-highlight
您可以在 less 中启用代码语法着色。首先,安装 source-highlight,然后将以下行添加到您的 shell 配置文件中:
~/.bashrc
export LESSOPEN="| /usr/bin/source-highlight-esc.sh %s" export LESS='-R '
lesspipe
命令行界面的常客可能需要安装 lesspipe。
现在,用户可以使用分页器列出归档文件内部的压缩文件:
$ less compressed_file.tar.gz
==> use tar_file:contained_file to view a file in the archive -rw------- username/group 695 2008-01-04 19:24 compressed_file/content1 -rw------- username/group 43 2007-11-07 11:17 compressed_file/content2 compressed_file.tar.gz (END)
lesspipe 还赋予了 less 处理非归档文件的能力,作为特定文件类型关联命令的替代(例如通过 python-html2text 查看 HTML)。
安装 lesspipe 后重新登录以激活它,或 source /etc/profile.d/lesspipe.sh。
Make
- colormake — 一个简单的 make 封装器,使输出更易读。
Ping
- prettyping — 为 ping 监控添加了很棒的功能。它是标准 ping 工具的封装器,旨在使输出更美观、更丰富多彩、更紧凑且更易于阅读。
Shell
bash
请参阅 Bash/Prompt customization#Colors。
Fish
请参阅 Fish#Web interface。
xonsh
zsh
请参阅 Zsh#Colors。
终端模拟器
虚拟控制台
可以在 Framebuffer 上运行的 Linux 虚拟控制台中更改颜色。方法是写入转义代码 \\e]PXRRGGBB,其中 X 是 0-F 的十六进制颜色索引,RRGGBB 是传统的十六进制 RGB 代码。
例如,要复用 ~/.Xresources 中定义的现有颜色,请将以下内容添加到 shell 初始化文件(如 ~/.bashrc)中:
if [ "$TERM" = "linux" ]; then
_SEDCMD='s/.*\*color\([0-9]\{1,\}\).*#\([0-9a-fA-F]\{6\}\).*/\1 \2/p'
for i in $(sed -n "$_SEDCMD" $HOME/.Xresources | awk '$1 < 16 {printf "\\e]P%X%s", $1, $2}'); do
echo -en "$i"
done
clear
fi
登录屏幕
以下是一个 /etc/issue 中虚拟控制台登录屏幕的彩色示例。以 root 身份备份原始文件 mv /etc/issue /etc/issue.bak,然后创建一个新的 /etc/issue:
\e[H\e[2J
\e[1;30m| \e[34m\r \s
\e[36;1m/\\\\ \e[37m|| \e[36m| = \e[30m|
\e[36m/ \\\\ \e[37m|| \e[36m| \e[30m| \e[32m\t
\e[1;36m/ \e[0;36m.. \e[1m\\\\ \e[37m//==\\\\\\ ||/= /==\\\\ ||/=\\\\ \e[36m| | |/\\\\ | | \\\\ / \e[30m| \e[32m\d
\e[0;36m/ . . \\\\ \e[37m|| || || || || || \e[36m| | | | | | X \e[1;30m|
\e[0;36m/ . . \\\\ \e[37m\\\\\\==/| || \\\\==/ || || \e[36m| | | |\ \\/| / \\\\ \e[1;30m| \e[31m\U
\e[0;36m/ .. .. \\\\ \e[0;37mA simple, lightweight linux distribution. \e[1;30m|
\e[0;36m/_' `_\\\\ \e[1;30m| \e[35m\l \e[0mon \e[1;33m\n
\e[0m
参见
- https://bbs.archlinux.org/viewtopic.php?pid=386429#p386429
- https://www.linuxfromscratch.org/blfs/view/svn/postlfs/logon.html
X 窗口系统
大多数 Xorg 终端(包括 xterm 和 urxvt)至少支持 16 种基本颜色。颜色 0-7 是“正常”颜色。颜色 8-15 是其“高亮”对应颜色。这些颜色可以通过 X 资源或特定的终端设置进行修改。例如:
~/.Xresources
! Black + DarkGrey *color0: #000000 *color8: #555753 ! DarkRed + Red *color1: #ff6565 *color9: #ff8d8d ! DarkGreen + Green *color2: #93d44f *color10: #c8e7a8 ! DarkYellow + Yellow *color3: #eab93d *color11: #ffc123 ! DarkBlue + Blue *color4: #204a87 *color12: #3465a4 ! DarkMagenta + Magenta *color5: #ce5c00 *color13: #f57900 !DarkCyan + Cyan (both not tango) *color6: #89b6e2 *color14: #46a4ff ! LightGrey + White *color7: #cccccc *color15: #ffffff
参见
- 请参见 #Using X resources 了解如何自动为加粗和下划线文本着色。
- Color Themes - Phraktured 整理的大量终端配色方案。
- Xcolors by dkeg(请查看仓库中路径符合
theme/dkeg - 主题名的文件) - base16 配色方案
使用 tput 设置前景色和背景色
设置加粗、黄色文字、蓝色背景的示例:
$ tput bold; tput setaf 3; tput setab 4
| tput 命令 | 描述 |
|---|---|
tput bold |
加粗文本 |
tput setaf [CODE] |
设置前景色 |
tput setab [CODE] |
设置背景色 |
tput rev |
反转颜色 |
tput sgr0 |
重置所有设置 |
| tput color [CODE] | 颜色 |
|---|---|
| 0 | 黑色 |
| 1 | 红色 |
| 2 | 绿色 |
| 3 | 黄色 |
| 4 | 蓝色 |
| 5 | 品红 |
| 6 | 青色 |
| 7 | 白色 |
在屏幕上打印 256 色的示例:
$ (x=`tput op` y=`printf %76s`;for i in {0..256};do o=00$i;echo -e ${o:${#o}-3:3} `tput setaf $i;tput setab $i`${y// /=}$x;done)
显示 tput 转义代码
将 tput op 替换为您想要追踪的任何 tput 命令。op 是默认的前景色和背景色。
$ ( strace -s5000 -e write tput op 2>&2 2>&1 ) | tee -a /dev/stderr | grep -o '"[^"]*"'
033[\033[1;34m"\33[39;49m"\033[00m
枚举支持的颜色
以下命令将帮助您发现您已安装 terminfo 支持的所有终端,以及每个终端支持的颜色数量。可能的值为:8, 15, 16, 52, 64, 88 和 256。
$ for T in `find /usr/share/terminfo -type f -printf '%f '`;do echo "$T `tput -T $T colors`";done|sort -nk2
Eterm-88color 88 rxvt-88color 88 xterm+88color 88 xterm-88color 88 Eterm-256color 256 gnome-256color 256 konsole-256color 256 putty-256color 256 rxvt-256color 256 screen-256color 256 screen-256color-bce 256 screen-256color-bce-s 256 screen-256color-s 256 xterm+256color 256 xterm-256color 256
配色方案脚本
请参阅 [4] 获取用于显示当前终端配色图表的脚本。
真彩色支持
一些终端支持 1600 万种颜色的全范围(RGB,每通道 8 位分辨率):xterm, konsole, st 等。相应的 TERM 值 xterm-direct, konsole-direct, st-direct 等从 ncurses 6.1 版本开始支持 [5]。有关支持真彩色的终端模拟器和应用程序的更多信息,请参见 [6]。
注意,Linux 内核支持用于真彩色的 SGR (Select Graphic Rendition) 转义序列,但使用它是没有意义的,因为驱动程序会将 24 位颜色规范映射到内核中的 256 色色表(参见函数 rgb_foreground, rgb_background)。因此,没有 linux-direct 的 terminfo 条目。