终端中的彩色输出
创建此页面的目的是整合 CLI 输出的彩色化。
背景
转义序列
《ANSI 转义序列》定义了一种将附加信息放入终端输出的方式,颜色是这种“附加信息”的一部分。多年来,终端颜色的范围已大大扩展,从最初的八种颜色到全 24 位真彩色。
基本的颜色编码提供了 8 种常规亮度的颜色和这 8 种颜色的 8 种更亮的版本。现代终端模拟器,包括 Linux 控制台本身,允许您指定颜色对应的精确 RGB 值。几乎所有终端模拟器都支持此模式。
随着 256 色显示器的出现,出现了 256 色转义。256 色包括 16 种基本颜色、216 种 RGB 颜色(按 6x6x6 立方体排列)和 24 级灰度。除了前 16 种颜色外,该方案通常是不可定制的,因为它具有明确的 RGB 映射。大多数终端模拟器都支持此模式。(少数模拟器使用类似但不兼容的编码,只有 88 种颜色。您实际上不太可能使用它们,但它们会出现在 terminfo 数据库中。)
支持较少的是真彩色模式,允许使用 1670 万(224)种 RGB 颜色(每个值从 0 到 255)。
Termcap 和 terminfo
Termcap 和 terminfo 是 ncurses 的一部分,它们是提供终端(通常由 TERM 环境变量指定)理解的转义序列信息的数据库。可以使用 tput(1) 和 infocmp(1) 命令从命令行访问它们。
应用程序
diff
diffutils 从 3.4 版本开始包含 --color 选项(GNU 邮件列表)。
$ alias diff='diff --color=auto'
grep
--color=auto 选项启用颜色高亮。颜色代码仅在标准输出中发出;不进入管道或重定向。
在 grep 中使用彩色输出对 正则表达式任务也很有用。
使用 别名永久启用此选项
alias grep='grep --color=auto'
GREP_COLORS 变量用于定义颜色,它配置高亮的各个部分。要更改颜色,请查找所需的 ANSI 转义序列并应用它。有关更多信息,请参阅 grep(1) § GREP COLORS。
-n 选项包含输出中的文件行号。
ip
来自 iproute2 的 ip(8) 命令支持 -c/-color 选项的彩色输出。使用 auto 参数时,仅当 stdout 是终端时才会启用彩色输出。 iproute2 可以构建为以 auto 为默认值,但 这样的更改已被 Arch 包维护者拒绝。
您可以使用 别名来启用彩色输出,例如:
alias ip='ip -color=auto'
less
环境变量
我们可以通过 --RAW-CONTROL-CHARS 和 --color/-D 参数来告诉 less 在需要加粗文本和其他格式化效果时发出颜色。我们也可以添加 --use-color 来启用 less UI 的彩色化。
例如,将 LESS 环境变量设置为 --RAW-CONTROL-CHARS --use-color -Dd+r -Du+b 将为加粗文本设置红色,为下划线文本设置蓝色。
有关更多信息,请参阅 less(1) § D 或 [1]。
从 stdin 读取
当您运行一个命令并将其 标准输出 (stdout) 管道到 less 进行分页查看(例如 pacman -Qe | less)时,您可能会发现输出不再是彩色的。这通常是因为程序试图检测其 stdout 是否是交互式终端,如果是,则打印彩色文本,否则打印无色文本。当您想将 stdout 重定向到文件时(例如 pacman -Qe > pkglst-backup.txt),这是个好行为,但当您想在 less 中查看输出时,则不太合适。
一些程序提供了一个选项来禁用交互式 tty 检测。
# dmesg --color=always | less
如果程序不提供任何类似选项,可以通过以下实用程序来欺骗程序,使其认为其 stdout 是交互式终端。
- ColorThis — 通过在一个(一组)伪终端中运行程序来强制彩色化程序的输出,支持转发 stdin。
- stdoutisatty — 一个小型程序和一个可
LD_PRELOAD的库,用于捕获 isatty(3) 函数调用。
- https://github.com/lilydjwg/stdoutisatty。 || stdoutisatty
- 示例:
stdoutisatty program | less
- unbuffer — 一个 tclsh 脚本,随 expect 一起提供,它在伪终端中调用所需的程序。
- unbuffer(1) || expect
- 示例:
unbuffer program | 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 ls='ls --color=auto'
LS_COLORS 变量用于定义颜色,它配置高亮的各个部分。使用 dircolors(1) 命令进行设置。
dircolors 的一个高级替代品,附带许多主题,是 vivid 包,请参阅 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 页。下面的大多数选项都通过替换加粗、突出显示和下划线序列为包含颜色的特殊序列来模拟彩色 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 容易,但需要额外的配置才能使 most 表现得像 less。安装 most 包。
编辑 /etc/man_db.conf,取消注释分页器定义并将其更改为:
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 上查看 man 页时添加颜色的一个快速方法是修改 ~/.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,您应该会看到彩色的 man 页。
此组合在 xterm/uxterm 中为 **加粗** 和 下划线 文本添加颜色,在 rxvt-unicode 中为 **加粗**、下划线 和 *斜体* 文本添加颜色。您可以尝试不同组合的这些属性。请参阅 源文件(已存档)。
pacman
Pacman 有一个颜色选项。取消注释 /etc/pacman.conf 中的 Color 行。
包装器
通用包装器
(大部分已过时,但仍然有效)
它们附带多种预配置的预设,可以进行更改,也可以创建/贡献新的预设。
- rainbow — 使用模式为命令输出或 STDIN 添加颜色。
预设: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 — 一个非侵入性的实时 ANSI 彩色包装器,用于常见的类 Unix 命令。包装了 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 — Cat 克隆,具有语法高亮和 git 集成。
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。
终端模拟器
虚拟控制台
可以在 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 提供的终端颜色主题列表。
- dkeg 的 Xcolors(请参阅存储库中路径匹配
theme/dkeg - theme的文件)。 - 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等。在ncurses版本6.1[5]及更高版本中支持相应的TERM值xterm-direct、konsole-direct、st-direct等。有关支持真彩色的终端模拟器和应用程序的更多信息,请参阅[6]。
请注意,Linux内核支持用于真彩色的SGR(Select Graphic Rendition)转义序列,但使用它没有意义,因为驱动程序会将24位颜色规格映射到内核中的256色调色板(请参阅函数rgb_foreground、rgb_background)。因此,没有terminfo条目linux-direct。