例如,我找到了这些方法,以简单的方式将彩色文本输出到屏幕:
RED="\033[0;31m" # Red color (via ANSI escape code);
NC='\033[0m' # No color (via ANSI escape code);
echo -e "${RED}This text is red. ${NC}" # -e flag allows backslash escapes;
或者:
printf '\e[1;34m%-6s\e[m' "This is blue text"
我还发现:
tput setaf 1; echo "this is red text"
但我从未使用过tput
,也不确定它是否随所有主要发行版(Debian、CetnOS、Arch 等)一起提供。
我的问题
如何以一种简单的方式输出给定命名的通用颜色(如“红色”)的彩色文本,我可以指望在所有主要发行版上工作,而不使用“混乱”的颜色代码?
答案1
您可以使用tput
。
我不确定
tput
所有主要发行版都附带了
它是 ncurses 的一部分,并且与这三种操作系统及其他操作系统一起打包。
- Debian ncurses-bin 软件包中的文件列表
stable
- ncurses 包中的文件的 Arch 列表
- ncurses 包的 Fedora 描述
- FreeBSD ncurses 端口/包中的文件列表
- 它实际上是 OpenBSD 基础的一部分。
因此,它tput setaf
可以在广泛的系统上工作,但明显的条件是需要安装必需的软件包。
缺点是使用它最终仍然会使用“非单词颜色代码”,因为提供的数字是 ECMA-48 中的 8 个标准颜色索引(在某些终端仿真器上可能有额外的 8 个事实上的标准颜色,并且通过在某些上使用 ISO 8613-6 索引颜色最多可显示 256 种颜色)。
从握持角度来看,8 种标准 ECMA-48 颜色是众所周知的,并且(例如)“6”作为颜色编号的含义并不那么晦涩难懂。
您也可以使用setterm
.
但是,如果您正在寻找更多使用名称而不是数字的人类可读命令(尽管只有英文),也有一些广泛的工具可以做到这一点。其中之一是setterm
,其用法如下:
% setterm --前景红色; echo“这是红色文本”
您setterm
可以在 Debian、Fedora 和 Arch 的存储库中找到来自 util-linux 工具集的工具集。该命令依赖于各种 Linux 特定的东西来实现某些功能其他该命令可以执行的操作,当然在 BSD 上不可用。工具集是正如其名称所示,Linux 特定且不可移植。
此外,虽然其手册页声称查阅了 terminfo 数据库,但更改颜色是实际程序无法按记录运行的相当多的情况之一。它才不是请参阅terminfo 中的setaf
和setab
功能。相反,该程序硬连线 ECMA-48 SGR 30–37,39,40–47,49 控制序列。
此外,它不支持从 8 到 15 的另外 8 个事实上的标准颜色索引。它没有跟上 Linux KVT 的功能,而 Linux KVT 支持“明亮”的颜色,至少现在接受ISO 8613-6 索引和直接颜色控制序列(尽管它实际上并未实现完整的 24 位颜色)。
此外,由于硬连线代码中存在错误,Debian Stable 中的 util-linux 版本setterm
在设置颜色时不会发出正确的 SGR 序列。
setterm
。用户命令。迈克尔·克里克。 2014年5月。
……现在甚至在 BSD 上也是如此。
发现这个错误是激发我编写替代品的原因之一setterm
,(巧合的是)我刚刚完成了这一工作。我没有复制 Linux 及其内核虚拟终端特有的(适量)内容。相反,我确实添加了一些已经存在了几十年的 ECMA-48 东西,而 util-linuxsetterm
没有(因为 Linux KVT 不支持 ECMA-48 的这一部分,并且setterm
其根源在于特定于 Linux) KVT)。我还添加了 UTF-8、对实际 8 位 C1 控制字符(及其 7 位别名)的支持,以及 ISO 8613-6 直接颜色(如果已知终端类型支持它)。
当然,这个实现做BSD 存在:
% 名称; printenv 术语 自由BSD 接收值 % TERM=ansi setterm --7bit --foreground red|hexdump -C 00000000 1b 5b 33 31 6d |.[31m| 00000005 % setterm --7bit --foreground red|hexdump -C 00000000 1b 5b 33 38 3b 35 3b 31 6d |.[38;5;1m| 00000009 % setterm --7bit --foreground 192|hexdump -C 00000000 1b 5b 33 38 3b 35 3b 31 39 32 6d |.[38;5;192m| 0000000b % setterm --7bit --foreground '#00BEC119'|hexdump -C 00000000 1b 5b 33 38 3b 35 3b 31 39 31 6d |.[38;5;191m| 0000000b % TERM=vte-256color setterm --7bit --foreground '#00BEC119'|hexdump -C 00000000 1b 5b 33 38 3b 32 3b 31 39 30 3b 32 35 3b 31 39 |.[38;2;190;25;19| 00000010 33 6d |3m| 00000012 % TERM=ansi setterm --7bit --foreground '亮红色' --background '亮黄色'|hexdump -C 00000000 1b 5b 39 31 6d 1b 5b 31 30 33 6d |.[91m.[103m| 0000000b % setterm --7bit --foreground '亮红色' --background '亮黄色'|hexdump -C 00000000 1b 5b 33 38 3b 35 3b 39 6d 1b 5b 34 38 3b 35 3b |.[38;5;9m.[48;5;| 00000010 31 31 6d |11m| 00000013 %
它位于 nosh 工具集 1.39 版本中,位于名为 的终端管理包中console-control-sequence
,允许将其与 util-linux 并存。命令的垫片名称setterm
由单独的垫片包提供。因此,如果您编写了一些用于setterm
更改颜色的内容,并且有人声称这是 Linux 特定的,那么您知道将他们引导到哪里。我已将手册页作为预览。
- 乔纳森·德博因·波拉德 (2018)。
setterm
。 小吃指南。软件。
顺便说一下,正确获取 SGR 代码。
SGR 0不是“没有颜色”。 SGR 0 重置所有颜色和属性。实际上不存在“无”颜色的概念。那里是由 SGR 39 和 SGR 49 设置的“默认”颜色的概念:
% setterm --7bit --前景默认 --背景默认|hexdump -C 00000000 1b 5b 33 39 6d 1b 5b 34 39 6d |.[39m。[49m| 0000000a %
答案2
代码(ANSI 颜色代码)
这些代码不依赖于发行版。它们是终末依赖性的。有些终端不支持它们。然而,他们可能得到大多数人的支持。
名称
使用变量来命名,例如
red="$(tput setaf 1)"
echo "${red}hello"
注意:不要对 shell 变量使用大写字母,大写字母应该保留用于环境变量。
名称和代码
这些代码指的是颜色编号。每个数字的颜色由终端定义,并且是非标准的。用户可以更改它。