【问题标题】:ANSI Color Specific RGB Sequence BashANSI 颜色特定 RGB 序列 Bash
【发布时间】:2013-03-18 22:22:27
【问题描述】:

我知道在 bash 终端中更改颜色的可靠方法是使用 ANSI 转义序列。例如:

echo -e "\033[0;31mbrown text\033[0;00m"

应该输出

brown text (in brown)

有没有办法使用带有 ANSI 的特定 RGB 集来输出颜色?说我想要鲜红色:

echo -e "**\033[255:0:0m**red text\033[0;00m"

这种东西存在吗?

我只想使用标准 bash。

【问题讨论】:

  • 维基百科有一篇关于ANSI escape codes的好文章!但是,尽管他们说有一种方法可以生成 RGB 彩色输出 (\033[38;2;r;g;bm),但我似乎无法让它在我的 gnome 终端中工作。
  • 值得一提:这与bash无关。 ANSI 转义序列由您的终端gnome-terminalxtermkonsole 等)解释。 bash 只是你的终端启动的一个shell(命令解释器)。

标签: ansi-escape


【解决方案1】:

这里的两个答案都没有提到TruecolorANSI support 8bpc 颜色。这将获得 OP 最初要求的 RGB 颜色。

使用 ;2 代替 ;5,并指定 RGB 值 (0-255)在以下三个控制段中。

\x1b[38;2;40;177;249m

测试if your terminal supports Truecolor

printf "\x1b[38;2;40;177;249mTRUECOLOR\x1b[0m\n"

在我的机器上,XTerm 愉快地输出了正确的颜色;但是,以现代 RGB 颜色之前的终端为模型的终端通常不支持真彩色 - 在使用转义码的这种特殊变体之前,请确保您知道您的目标。


我还想指出 38;5/;2 - Blue Ice mentioned 38 路由,然后 5 改变颜色。这有点不正确。

38是xterm-256扩展前景色代码; 30-37 只是 16 色前景代码(在某些系统上,亮度由转义代码 1 和可论证支持的 90-97 非标准“明亮”代码控制)所有兼容 vt100/xterm 的彩色终端都支持。

;2;5 表示颜色的格式,最终告诉终端还要拉多少序列:;5 指定 8 位格式(如 Blue Ice 所述),只需要多 1 个控制段, 和 ;2 指定需要 3 个控制段的完整 24 位 RGB 格式。

这些扩展模式在技术上是“未记录的”并且完全由实现定义。据我所知并可以研究,它们不受 ANSI 委员会管辖。


对于这种倾向,5;(256 色)格式以 16 种原始颜色(深色/浅色,因此 30-37 和 90-97)作为颜色 0-15 开始。

前面的 216 种颜色 (16-231) 由偏移 16 的 3bpc RGB 值组成,打包成一个值。

最后的 24 种颜色 (232-256) 为灰度,从比黑色稍浅的阴影开始,到比白色稍暗的阴影。一些模拟器将这些步骤解释为所有三个通道上 (256 / 24) 的线性增量,尽管我遇到了一些似乎明确定义这些值的模拟器。

这是一个执行这种转换的 Javascript 函数,它考虑了所有的灰色。

function rgbToAnsi256(r, g, b) {
    // we use the extended greyscale palette here, with the exception of
    // black and white. normal palette only has 4 greyscale shades.
    if (r === g && g === b) {
        if (r < 8) {
            return 16;
        }

        if (r > 248) {
            return 231;
        }

        return Math.round(((r - 8) / 247) * 24) + 232;
    }

    var ansi = 16
        + (36 * Math.round(r / 255 * 5))
        + (6 * Math.round(g / 255 * 5))
        + Math.round(b / 255 * 5);

    return ansi;
}

因此,在某种程度上,您可以通过将初始 RGB 值从 8 位减少到 3 位来calculate 256 ANSI 颜色,以便在您想以编程方式在不支持的终端上执行此操作时形成 256 编码值。支持真彩色。

【讨论】:

  • 为了后代,我是本文底部链接的存储库的维护者。
  • 非常感谢!这对我在 Python 中帮助很大。
【解决方案2】:

这确实存在,但不是 OP 正在寻找的 16777216 (256^3) 种颜色,而是 216 (6^3) 种均匀分布的颜色,在更大的 256 种颜色中。示例:

echo -e "\033[38;5;208mpeach\033[0;00m"

这将输出一种令人愉悦的桃色文本。


拆开这个命令:\033[38;5;208m

\033 是转义码。 [38; 将命令定向到前台。如果您想改为更改背景颜色,请改用 [48;5; 只是改变颜色的序列的一部分。而最重要的部分,208m,选择了实际的颜色。


在这个转义的 256 色序列中可以找到 3 组颜色。第一组是基本的“糖果”颜色组,或值 0-15。然后是一个分布颜色的立方体,从 16 到 231。最后还有一个详细的灰度设置,范围为 232-255。

您可以在此处找到包含所有这些值的表格:http://bitmote.com/index.php?post/2012/11/19/Using-ANSI-Color-Codes-to-Colorize-Your-Bash-Prompt-on-Linux#256%20(8-bit)%20Colors

【讨论】:

  • @AaronJLang \e 并非在所有 shell 中都支持。
  • 0–256 不是 256 色;它有 257 种颜色! :P
  • @HelloGoodbye 它实际上是.. 0-255(255 是最大值)所以他们的 256 已经是正确的..
【解决方案3】:

这会起作用

echo -e "**\033[38;2;255;0;0m**red text\033[0;00m"

格式:"\033[38;2;R;G;Bm"

  • R 是 RGB 中的 RED 分量
  • G 是 RGB 中的绿色组件
  • B 是 RGB 的蓝色分量

【讨论】:

    【解决方案4】:

    当前,某些终端仿真器支持真彩色转义序列 (\e[38;2;R;G;Bm),包括 gnome-terminal(vte >= 0.36)、konsole 和 st [suckless]。

    某些其他功能支持该功能,例如pterm [putty],术语 [enlightenment],urxvt.

    xterm 介于两者之间:它识别转义序列,但将每种颜色四舍五入到 256 色调色板中最接近的一种。

    【讨论】:

    • 关于 Xterm 的有趣事实。他们显然也做错了。
    【解决方案5】:

    没有。

    对于 nitpick,从技术上讲,这些不是“ANSI 转义序列”,而是 VT100 control codes(早在出现图形终端和诸如“RGB”之类的术语之前就已定义)。

    【讨论】:

    • 是的,there is,尽管许多 shell 不支持它。您可以使用38;2,而不是38;5。刚刚在 XTerm 中尝试过 - 效果很好。
    • @Qix 您可以设置颜色,但我正在回答是否可以设置 RGB 颜色 的问题,即任意颜色,这是不可能的。
    • 不确定您从哪里获取信息,但是可以;看看我的回答。全 24 位 RGB 颜色。
    • @JoachimPileborg:“非常新”你的意思是超过十年“仅限于几个终端”是指来自 Gnome 和 KDE 的默认 X 终端,还有 XTerm 和 Linux 控制台?
    • 我觉得你发布的链接的标题是“ANSI/VT100 终端控制转义序列”有点好笑。
    猜你喜欢
    • 2011-06-18
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2012-03-19
    • 2011-01-02
    • 2017-10-28
    • 2019-07-02
    相关资源
    最近更新 更多