跳转至内容

终端中的彩色输出

来自 ArchWiki

本文章或章节需要扩充。

原因: 也许可以扩充内容。如果您能添加更多有价值的信息,请积极参与。(请在 Talk:Color output in console 进行讨论)

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因: 本页面部分是不同应用程序的集合,部分开始介绍彩色输出的理论基础。如果您有相关知识,请贡献内容。(请在 Talk:Color output in console 进行讨论)

创建此页面旨在整合 CLI 输出的配色方案。

背景

本文章或章节需要扩充。

原因: 现在将 list-color 脚本移至此处可能是一个好主意。(请在 Talk:Color output in console 进行讨论)

转义序列

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]

从标准输入读取

注意: 建议通过 #环境变量 添加彩色输出,因为下文假设 LESS 已设置为包含 -R

当您运行命令并通过管道将其 标准输出 (stdout) 传给 less 进行分页查看(例如 pacman -Qe | less)时,您可能会发现输出不再有颜色。这通常是因为程序会尝试检测其 stdout 是否为交互式终端,如果是,它会打印带颜色的文本,否则打印不带颜色的文本。当您想将 stdout 重定向到文件(例如 pacman -Qe > pkglst-backup.txt)时,这是一种很好的行为,但在想要在 less 中查看输出时却不那么适用。

一些程序提供了禁用交互式 tty 检测的选项。

# dmesg --color=always | less

如果程序没有提供类似的选项,可以使用以下工具欺骗程序,使其认为其 stdout 是一个交互式终端:

  • ColorThis — 通过在 pty 中运行程序来强制输出颜色,支持转发 stdin。
https://github.com/Sasasu/ColorThis || colorthis-gitAUR
  • stdoutisatty — 一个小程序和支持 LD_PRELOAD 的库,用于拦截 isatty(3) 函数调用。
https://github.com/lilydjwg/stdoutisatty || stdoutisatty
示例: stdoutisatty 程序名 | less
  • unbuffer — 随 expect 提供的 tclsh 脚本,它在 pty 中调用所需的程序。
unbuffer(1) || expect
示例: unbuffer 程序名 | less

或者,使用 zshzpty 模块:[2]

~/.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) 命令进行设置。

随许多主题一同分发的 vividdircolors 的一个高级替代品,请参阅 vivid --help 查看用法。

注意: 在包含大量条目的目录中运行 ls 时,使用 --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' 的基本功能类似于 lessmore,但功能集较小。配置 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/uxtermrxvt-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/uxtermrxvt-unicode,您应该能看到彩色的手册页。

这种组合在 xterm/uxterm 中将颜色应用于加粗下划线单词,或在 rxvt-unicode 中应用于加粗下划线斜体文字。您可以尝试这些属性的不同组合。请参阅该项目的源码(已归档)。

pacman

Pacman 有一个颜色选项。取消 /etc/pacman.confColor 行的注释即可。

封装器

本文或章节是被提议移动到 [[]] 的候选者。

注释: 其中一些可以单独成节,或移至现有章节,例如 #diff(请在 Talk:Color output in console 进行讨论)。

通用封装器

(大多数已过时,但仍可工作)

它们带有多个预配置的预设,可以更改,也可以创建/贡献新的预设。

警告: 封装器使用转义序列替换命令输出。一些依赖于标准 shell 工具输出的 shell 脚本和程序可能无法正常工作。
  • rainbow — 使用模式为命令输出或标准输入着色。
    预设:df, diff, env, host, ifconfig, java-stack-trace, jboss, jonas, md5sum, mvn2, mvn3, ping, tomcat, top, traceroute。
https://github.com/nicoulaj/rainbow || rainbowAUR
  • 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。
https://github.com/garabik/grc || grc
  • 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。
https://github.com/yogan/cope || cope-gitAUR
  • 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。
https://cwrapper.sourceforge.net/ || cwAUR
  • ccze — 一个用 C 编写的快速日志着色器,旨在作为 colorize 的直接替代品。
https://github.com/cornet/ccze/ || cczeAUR

用于输出着色的库

  • libtextstyle — 一个用于设置终端文本输出样式的 C 库。
https://gnu.net.cn/software/gettext/libtextstyle/manual/index.html || gettext
  • ruby-rainbow — Rainbow 是 Ruby String 类的扩展,增加了在 ANSI 终端上对文本着色的支持。
https://rubygems.org.cn/gems/rainbow/ || ruby-rainbow
  • python-blessings — 一个轻量级、实用的终端着色、样式设置和定位封装器。
https://github.com/erikrose/blessings || python-blessingsAUR
  • lolcat — 让输出像彩虹一样多彩的 Ruby 程序。
https://github.com/busyloop/lolcat/ || lolcat

特定应用程序

编译器

  • colorgcc — 一个 Perl 封装器,用于根据 gcc 输出格式匹配警告/错误消息并对编译器输出进行着色。
https://github.com/colorgcc/colorgcc || colorgcc

diff

Diff 有 内置的彩色输出,建议使用。但也可以使用以下封装器:

  • colordiff — 用于 diff 高亮的 Perl 脚本。
https://www.colordiff.org/ || colordiff
  • cwdiff — 支持目录和高亮的 (w)diff 封装器。
https://github.com/junghans/cwdiff || cwdiffAUR
  • git-delta — 用于 git 和 diff 输出的语法高亮分页器。
https://github.com/dandavison/delta || git-delta

cat

  • bat — 带有语法高亮和 git 集成的 cat 克隆。
https://github.com/sharkdp/bat || bat

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 封装器,使输出更易读。
https://github.com/pagekite/Colormake/ || colormakeAUR

Ping

  • prettyping — 为 ping 监控添加了很棒的功能。它是标准 ping 工具的封装器,旨在使输出更美观、更丰富多彩、更紧凑且更易于阅读。
https://denilson.sa.nom.br/prettyping/ || prettyping

Shell

bash

请参阅 Bash/Prompt customization#Colors

Fish

请参阅 Fish#Web interface

xonsh

请参阅 Customizing the Prompt

zsh

请参阅 Zsh#Colors

终端模拟器

虚拟控制台

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因: 对“颜色”的定义不够清晰。例如,在 #Virtual console 中,它们是指 16 种基础颜色的表现形式(黄色、红色、蓝色等的 RGB 值),而在 #Login screen 中,它们是指基础颜色本身。另请参阅 console_codes(4)User:Isacdaavid/Linux_Console(请在 Talk:Color output in console 进行讨论)。

可以在 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 

参见

X 窗口系统

大多数 Xorg 终端(包括 xtermurxvt)至少支持 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
警告: foregroundbackground 等颜色资源可能会被其他应用程序(如 emacs)读取。可以通过指定类名来避免这种情况,例如 XTerm.foreground

参见

使用 tput 设置前景色和背景色

设置加粗、黄色文字、蓝色背景的示例:

$ tput bold; tput setaf 3; tput setab 4
tput 命令行选项速查表
tput 命令 描述
tput bold 加粗文本
tput setaf [CODE] 设置前景色
tput setab [CODE] 设置背景色
tput rev 反转颜色
tput sgr0 重置所有设置
tput 颜色代码
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 转义代码

本文或章节是被提议与 Bash/Prompt_customization 合并的候选者。

注释: 该文章提供了更多关于 tput 的背景信息(请在 Talk:Color output in console 进行讨论)。

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 条目。

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.