在所有主要发行版中输出彩色文本而不使用非单词颜色代码(如 \033[0;31m)

0 colors bash stability output distributions

例如,我找到了这些方法,以简单的方式将彩色文本输出到屏幕:

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;
Run Code Online (Sandbox Code Playgroud)

或者:

printf '\e[1;34m%-6s\e[m' "This is blue text"
Run Code Online (Sandbox Code Playgroud)

我还发现:

tput setaf 1; echo "this is red text"
Run Code Online (Sandbox Code Playgroud)

但我从未使用过tput,我不确定它是否随所有主要发行版(Debian、CetnOS、Arch 等)一起提供。

我的问题

如何以一种简单的方式以给定的命名通用颜色(如“红色”)输出彩色文本,我可以指望在所有主要发行版上工作,而不使用“凌乱”颜色代码?

Jde*_*eBP 8

您可以使用tput.

我不确定 [that tputis] 随所有主要发行版一起提供

它是 ncurses 的一部分,并与所有三个操作系统以及更多操作系统一起打包。

Sotput setaf将适用于广泛的系统,但明显的条件是需要安装必需的软件包。

缺点是使用它最终仍然使用“非单词颜色代码”,因为一个人提供的数字是来自 ECMA-48 的 8 个标准颜色索引(在某些终端仿真器上可能有额外的 8 个事实上的标准颜色,并且通过在某些情况下使用 ISO 8613-6 索引颜色,最多可达 256 色)。

在抓手上,8 种标准的 ECMA-48 颜色是众所周知的,并且(例如)“6”作为颜色编号的含义并不是那么模糊。

您也可以使用setterm.

但是,如果您正在寻找更多使用名称而不是数字的人类可读的命令,尽管只有英文,也有广泛的工具可以做到这一点。其中一个是setterm,其用法如下:

% setterm --前景红色;echo "这是红色文字"

setterm,你会发现在Debian中,Fedora的的仓库和拱门是从util的Linux的工具集之一。该命令依赖于各种特定于 Linux 的东西来执行该命令可以执行的一些其他操作,当然它在 BSD 上不可用。工具集特定于 Linux 的,不可移植,正如其名称所表明的那样。

此外,虽然其手册页声称已咨询 terminfo 数据库,但更改颜色是实际程序无法按文档工作的少数情况之一。它咨询terminfo 中的setafsetab功能。相反,该程序硬连线 ECMA-48 SGR 30–37,39,40–47,49 控制序列。

此外,它不支持从 8 到 15 的额外 8 个事实上的标准颜色索引。它没有跟上 Linux KVT 的功能,它确实支持“明亮”颜色,现在至少接受ISO 8613-6 索引和直接颜色控制序列(尽管它实际上并未实现完整的 24 位颜色)。

此外,由于该非常硬的代码中的错误,settermDebian Stable 中的 util-linux 版本在设置 colors 时不会发出正确的 SGR 序列

  • setterm. 用户命令。迈克尔·凯里斯。2014-05。

......即使在 BSD 上,现在。

发现那个 bug 是激发我编写setterm替换程序的原因之一,我(巧合地)刚刚完成了它。我没有将那些(中等数量)特有的东西复制到 Linux 及其内核虚拟终端中。相反,我确实添加了一些 ECMA-48 的东西,这些东西已经存在了几十年,而 util-linuxsetterm没有(因为 Linux KVT 不支持 ECMA-48 的那部分,并且setterm其根源在于特定于 Linux KVT)。我还添加了 UTF-8,支持实际的 8 位 C1 控制字符(以及它们的 7 位别名)和 ISO 8613-6 直接颜色(如果已知终端类型支持它)。

当然,对于 BSD确实存在这种实现:

% 名; 打印环境术语
FreeBSD
收货人
% 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和49 SGR集的概念:

% setterm --7bit --foreground default --background default|hexdump -C
00000000 1b 5b 33 39 6d 1b 5b 34 39 6d |.[39m.[49m|]
0000000a
%