如何在 bash 中获取当前终端颜色对

how to get current terminal color pair in bash

我想在BASH中查询并存储当前终端颜色对,例如:

#!/bin/bash

#some ANSI colour escape sequences
red="3[0;31m"
grn="3[0;32m"
blu="3[0;34m"

def="3[0;00m" # default

echo -e "Change to ${red} red to ${def} default to ${blu} blue."

# now store the current color (which happens to be blue) e.g.:

cur=????

echo -e "Change to ${grn} green and back to what I had before ${cur}"
echo -e "This would be in blue if variable cur contained e.g.: 0;34m."
echo -e "Back to default${def}"
exit 0

我的答案是如何捕捉当前颜色

cur=????

了解最终状态 与 bash 无关很重要。 Bash 不在乎。它只是从 stdin 读取并写入 stdoutstderr。 (见注1)

所有的终端效果都是由您正在使用的终端仿真器实现的,终端仿真器有很多。例如,在图形环境中,您可能会使用 xtermkonsole。您需要在这些模拟器的文档中搜索它们解释的特定终端控制代码。

据我所知,除了光标位置 (ESC[6n).

所以最好的办法是在进行更改时记住所做的更改。

您可以使用 man console_codes 找到 Linux 控制台实现的标准代码列表(尽管现在很少有人使用 Linux 控制台);其中大部分也由 xterm 和其他图形控制台解释。 Thomas Dickey 的 xterm site 中有一个 xterm 序列列表;它或多或少是终端仿真器的事实标准,但正如我所说,您需要在每个仿真器的文档中搜索特殊控制序列。

备注

  1. 在交互模式下,bash 使用名为 readline 的库来帮助它处理一些终端效果。特别是,readline 试图保持当前控制台光标位置,尽管很容易愚弄它。在 PS1 中,您需要用 \[\] 包围控制台控制序列,因为 readline 不知道它们是控制序列。

你不能;没有标准的控制序列来报告当前游标属性。

但是,存在的是一个序列,用于保存和恢复当前光标位置和属性:

  • \e7 (DECSC) 将保存光标位置和属性。
  • \e8 (DECRC) 将恢复保存的光标位置和属性。

没有恢复游标属性的标准方法;但是,正如 rici 提到的,您可以使用 \e[6n (DSR) 获取当前位置的报告,然后在恢复其位置和属性后使用响应手动 "un-restore" 光标位置。

不过,再次强调,只跟踪应用程序中的颜色可能更容易(也更好),而不是让终端负责。

问题是关于当前颜色,而不是光标位置

两者都是"nonstandard"(尽管后者,游标位置报告是由任何对"VT100 emulator"有效声明的东西实现的)。

但是,xterm 实现了一组称为 动态颜色 的转义序列,它早于 ANSI 颜色功能。那些设置工作颜色,包括文本前景和背景。我在 2002 中对此进行了修改,以允许应用程序发送带有“?”的序列。而不是告诉 xterm return 颜色值的颜色,例如

OSC 1 1 ? ST

使用 XTerm Control Sequences

中给出的符号

据我了解,您要求获取用户的默认配置文件颜色,您已更改其中的颜色!

例如:用户在黑色背景上使用'亮绿色字体颜色',您将其更改为“白色 背景 上的[红色 字体颜色”。现在如何 get/know 默认颜色并将它们设置回默认颜色!


您可以在 bash 中使用序列 3[0m [也用于 命令提示符 (批处理脚本) / powershell(ps 脚本)]