您可以使用tput。

您可以使用tput。

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

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 的一部分,并且与这三种操作系统及其他操作系统一起打包。

因此,它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 中的setafsetab功能。相反,该程序硬连线 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 变量使用大写字母,大写字母应该保留用于环境变量。

名称和代码

这些代码指的是颜色编号。每个数字的颜色由终端定义,并且是非标准的。用户可以更改它。

相关内容