控制台彩色输出
创建此页面是为了整合 CLI 输出的着色。
背景
转义序列
ANSI 转义序列定义了一种将附加信息放入终端输出的方法,颜色是这种“附加信息”的一部分。多年来,终端颜色的范围已大大扩展,从最初的八种颜色到完整的 24 位真彩色。
基本颜色编码提供 8 种正常亮度的颜色和 8 种更亮版本的这些颜色。现代终端模拟器,包括 Linux 控制台本身,允许您指定颜色转换成的精确 RGB 值。几乎所有终端模拟器都支持此模式。
随着 256 色显示器的出现,出现了 256 色转义序列。256 种颜色是 16 种基本颜色、216 种 RGB 颜色(以 6x6x6 立方体排列)和 24 级灰度。除了前 16 种颜色外,该方案通常不可自定义,因为它具有明确定义的 RGB 映射。大多数终端模拟器都支持此模式。(少数模拟器使用类似但不兼容的编码,只有 88 种颜色。您在实践中不太可能使用它们,但它们会出现在 terminfo 数据库中。)
较少支持的是真彩色模式,允许您在 RGB 中使用 1670 万 (224) 种颜色(每个值的范围从 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 中使用彩色输出对于 regexp 任务也很有用。
使用 别名 永久启用此选项
alias grep='grep --color=auto'
GREP_COLORS
变量用于定义颜色,它配置高亮的各个部分。要更改颜色,请找到所需的 ANSI 转义序列 并应用它。有关更多信息,请参阅 grep(1) § GREP COLORS。
-n
选项在输出中包含文件行号。
ip
ip(8) 命令来自 iproute2,支持使用 -c
/-color
选项进行着色。当使用 auto
参数时,仅当 stdout 是终端时才会启用彩色输出。iproute2 可以构建为默认使用 auto
,但 这样的更改 已被 Arch 软件包维护者拒绝。
您可以使用 别名 来启用彩色输出,例如
alias ip='ip -color=auto'
less
环境变量
与 #man 情况一样,我们可以告诉 less 在它打算制作粗体文本和其他格式效果时发出颜色。
将以下行添加到您的 shell 配置文件
export LESS='-R --use-color -Dd+r$Du+b$'
它将为粗体设置红色,为下划线设置蓝色。
有关 --use-color
和 -D
选项的更多信息,请参阅 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 中运行程序来强制程序的彩色输出,支持转发标准输入。
- stdoutisatty — 一个小程序和一个
LD_PRELOAD
可加载库,用于捕获 isatty(3) 函数调用。
- https://github.com/lilydjwg/stdoutisatty。 || stdoutisatty
- 示例:
stdoutisatty program | less
- unbuffer — 一个 tclsh 脚本,随 expect 一起提供,它在 pty 中调用所需的程序。
- 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 页面。在这里,我们通过破解两个主要分页器 less
和 most
来伪造彩色 man
:我们用包含颜色的 spiced 序列替换粗体、突出显示和下划线的序列。
使用 bat
通过设置 MANPAGER
环境变量 如此处文档所述,bat 可以用作 man 的着色分页器。
使用 less
有关更详细的描述,请参阅 #less。
export MANPAGER="less -R --use-color -Dd+r -Du+b" export MANROFFOPT="-P -c"
对于 Fish,您可以使用以下方法完成此操作
~/.config/fish/config.fish
set -xU MANPAGER 'less -R --use-color -Dd+r -Du+b' set -xU MANROFFOPT '-P -c'
请记住 source 您的配置或重启您的 shell 以使更改生效。
使用 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
使用 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 输出格式匹配的警告/错误消息为编译器的输出着色
- https://schlueters.de/colorgcc.html[失效链接 2024-03-03 ⓘ] || colorgcc
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。
终端模拟器
虚拟控制台
可以更改在帧缓冲上运行的 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
中虚拟控制台登录界面的彩色示例。使用 mv /etc/issue /etc/issue.bak
以 root 身份创建原始文件的备份,并创建一个新的 /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
参见
- #使用 X 资源,了解如何自动为粗体和下划线文本着色。
- 颜色主题 - Phraktured 提供的终端颜色主题的广泛列表。
- dkeg 的 Xcolors (请查看仓库中路径匹配
theme/dkeg - theme
的文件) - base16 配色方案
使用 tput 设置前景色和背景色
设置粗体黄色文本和蓝色背景的示例
$ tput bold; tput setaf 3; tput setab 4
tput 命令 | 描述 |
---|---|
tput bold |
粗体文本 |
tput setaf [代码] |
设置前景色 |
tput setab [代码] |
设置背景色 |
tput rev |
反色 |
tput sgr0 |
重置所有设置 |
tput color [代码] | 颜色 |
---|---|
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
枚举终端功能
此命令可用于查看您的终端支持哪些功能。
$ infocmp -1 | tr -d '\0\t,' | cut -f1 -d'=' | grep -v "$TERM" | sort | column -c80
acsc ed kcuu1 kich1 rmso am el kDC kLFT rmul bce el1 kdch1 km rs1 bel enacs kel kmous rs2 blink eo kend knp s0ds bold flash kEND kNXT s1ds btns#5 fsl kent kpp s2ds bw home kf1 kPRV s3ds ccc hpa kf10 kRIT sc civis hs kf11 kslt setab clear ht kf12 lines#24 setaf cnorm hts kf13 lm#0 setb colors#0x100 ich kf14 mc0 setf cols#80 ich1 kf15 mc4 sgr cr il kf16 mc5 sgr0 csr il1 kf17 mc5i sitm cub ind kf18 mir smacs cub1 indn kf19 msgr smam cud initc kf2 ncv#0 smcup cud1 is1 kf20 npc smir cuf is2 kf3 op smkx cuf1 it#8 kf4 pairs#0x7fff smso cup ka1 kf5 rc smul cuu ka3 kf6 rev tbc cuu1 kb2 kf7 ri tsl cvvis kbs kf8 rin u6 dch kc1 kf9 ritm u7 dch1 kc3 kfnd rmacs u8 dl kcbt kFND rmam u9 dl1 kcub1 kHOM rmcup vpa dsl kcud1 khome rmir xenl ech kcuf1 kIC rmkx xon
配色方案脚本
请参阅 [3] 获取显示当前终端配色方案图表的脚本。
真彩色支持
一些终端支持完整的 1600 万种颜色(RGB,每种颜色 8 位分辨率):xterm、konsole、st 等。相应的 TERM 值 xterm-direct
、konsole-direct
、st-direct
等从 ncurses 6.1 版本 [4] 开始支持。有关支持真彩色的终端模拟器和应用程序的更多信息,请参阅 [5]。
请注意,Linux 内核支持真彩色的 SGR(选择图形再现)转义序列,但使用它是没有意义的,因为驱动程序将 24 位颜色规范映射到内核中的 256 色颜色映射(请参阅函数 rgb_foreground
、rgb_background
)。因此,没有 terminfo 条目 linux-direct
。