如何在终端中用一种颜色代码替换另一种颜色代码?

如何在终端中用一种颜色代码替换另一种颜色代码?

我可以让 bash 自动用一种颜色代码替换另一种颜色代码吗?例如,每当程序输出用颜色代码包装的文本作为粗体前景时,我希望 bash 实际上使用绿色背景代码或其他内容。

我想要这个的原因是因为我的终端模拟器(终结者)不允许我更改粗体前景的颜色 - 例如,echo -e "\e[1;39m Foo"无论我设置的调色板如何,都会始终以白色输出“Foo”,这会产生丑陋的结果。我想让 bash 使用\e[1;37m代码(粗体白色,我可以在终结者首选项中更改)而不是\e[1;39m.

编辑:据我了解,做我想做的事更多的是像termcapbashterminfo本身这样的事情。有没有人对这两个有经验的?

答案1

Bash 对应用程序使用的颜色没有任何规定,当然 bash 本身使用的颜色除外。应用程序与终端交互; bash 仅启动它们并通知它们何时完成。

应用程序知道如何通过以下方式与终端对话术语帽(传统)或术语信息(现代)数据库。 Termcap 比颜色更古老,但 terminfo 确实对颜色有一些了解。看着那(这terminfo(5)手册页查看您的系统支持的功能列表。无法为各个颜色指定控制序列,但您可以通过该initc功能配置每种颜色的外观来获得基本相同的结果。例如,这会将颜色 1(通常为红色)的外观更改为亮绿色:

tput initc 1 0 255 0

ncurses 数据库不包含此功能terminatorxterm自 Debian jessie 版本 5.9 起)。然而,这些终端模拟器(以及基于 vte 的任何其他终端)确实支持可用于此目的的转义序列:OSC 4 ; c ; spec BEL。这是将红色变成亮绿色的方法:

printf '\e]4;1;#00ff00\a'

基本颜色编号为0-7;这些颜色的粗体文本使用颜色 8-15。您还可以使用更改默认颜色中用于粗体的颜色等(详细信息请参阅控制序列列表)。OSC 5 ; 0 ; spec BEL

这些设置同时影响前景色和背景色,无法单独影响前景色和背景色。

要自定义颜色的外观,您可以从.bashrc.这只会影响运行 bash 交互式实例的终端,而不影响直接启动另一个应用程序的终端。

我不知道这与终结者的调色板设置如何相互作用。

相关内容