如何确定控制台输出的当前颜色?

Min*_*nix 16 colors escape-characters console

我知道,如果有彩色终端可用,则可以使用转义字符为其输出着色

但是有没有可能找出输出当前显示为哪种颜色?或者更好的是,如果我现在输出它,文本会是什么颜色?

我要求在使用这些转义字符时不要破坏任何以前的颜色设置。“默认前景色”转义字符是从配色方案中获取它的信息,而不是我更改它之前的文本颜色。

mik*_*erv 12

xterm你可以通过改变颜色变化逃生查询上报的当前颜色RGB颜色代码。使用ESC ] Ps m- 但添加一个?问号。从文档

  • 如果"?"给出 a 而不是名称或 RGB 规范,则xterm回复一个相同形式的控制序列,可用于设置相应的动态颜色。因为在一个控制序列中可以给出多于一对的色号和规格,xterm所以可以做出多于一个的答复。
    • P s = 1 0 ? 将 VT100 文本前景色更改为 P t 。
    • P s = 1 1 ? 将 VT100 文本背景颜色更改为 P t 。
    • P s = 1 2 ? 将文本光标颜色更改为 P t 。
    • P s = 1 3 ? 将鼠标前景色更改为 P t 。
    • P s = 1 4 ? 将鼠标背景颜色更改为 P t 。
    • P s = 1 5 ? 将泰克前景色更改为 P t 。
    • P s = 1 6 ? 将泰克背景颜色更改为 P t 。
    • P s = 1 7 ? 将高亮背景颜色更改为 P t 。
    • P s = 1 8 ? 将泰克光标颜色更改为 P t 。
    • P s = 1 9 ? 将高亮前景色更改为 P t 。

我严重怀疑这是否可能在另一个终端模拟器中工作,但xterm如果你运行......

printf '\033]11;?\007'
Run Code Online (Sandbox Code Playgroud)

...xterm将按如下序列推回终端的输入缓冲区...

11;rgb:ffff/ffff/ffff
Run Code Online (Sandbox Code Playgroud)

...对于背景或前景:

printf '\033]10;?\007'

10;rgb:0000/0000/0000
Run Code Online (Sandbox Code Playgroud)


Jde*_*eBP 12

一般来说,获得当前颜色是不可能的。终端的控制序列处理发生在终端“内部”,无论发生在何处。使用终端仿真器(例如xterm或内置于提供内核虚拟终端的操作系统内核中的终端仿真器),仿真器的内部状态,包括其当前“图形再现”(即颜色和属性)的概念,在机器上本身,理论上是可以访问的。但是对于真正的终端,此信息位于通过串行链路连接的物理独立机器上的某个 RAM 位置。

也就是说,一些终端包括一种机制,用于读取此类信息作为其终端协议的一部分,通过该串行链路发送。它们提供程序可以发送到终端的控制序列,使程序将有关其内部状态的信息作为终端输入发回mikeserv已经向您展示了xterm终端仿真器响应的控制序列。但这些是特定于xterm. 例如,Linux 内核和各种 BSD 内核中的内置终端仿真器是不同的终端类型,根本不实现任何此类控制序列。真正终端的整个系列也是如此。

DEC VT525 终端实现了一种读出机制,但具有一组与xterm. 发送 DECRQSS(请求选择或设置)序列以请求当前图形再现,终端通过发送 DECRPSS(报告选择或设置)来响应。具体来说:

  1. 主机发送:DCS $ q mST(以SGR的控制功能部分为设置的DECRQSS)
  2. 终端响应:DCS 0 $ r 0 ; 3 3 ; 4 4 mST(DECRPSS 带有设置当前前景和背景颜色的 SGR 控制序列的参数和控制功能部分)

当然,仔细阅读你的问题会发现你又在那些欧洲货币体系中挥舞着巧克力香蕉。您实际尝试做的是,您已经选择了一个解决方案,然后询问如何执行该解决方案的一部分,是在您编写一些彩色输出时保留以前的状态。不仅有用于执行此操作的 DEC VT 控制序列,还有用于它的 SCO 控制台终端序列,可被xterm各种内核内置终端仿真器识别,以及一个 termcap/terminfo 条目,告诉您它们对您的终端是什么。

termcap 条目是scrc。terminfo 条目是save_cursorrestore_cursor。这些名称在效果上有些误导(尽管它们确实起到了警告的作用,即您依赖的是事实而非法律上的东西)。实际的 DECSC、DECRC、SCOSC 和 SCORC 控制序列也保存和恢复当前的图形再现。

鉴于您指向的文章都是关于从 shell 脚本生成控制序列,您现在正在寻找的命令是tput.

进一步阅读

  • 注意到这“与 xterm 使用的那些没有关系”——然而,xterm 支持 DECRQSS 已经有一段时间了。带有 SGR 响应(包括颜色)的部件可追溯到 1996 年。 (2认同)
  • 请参阅 xterm 的控制序列文档中的 [*进一步阅读*](https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Further-reading),其中指出 VT520/etc 文档是当 xterm 开始在`DECRQSS` 中提供颜色时不可用(大约延迟了 7 年......)。 (2认同)