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

Posted

技术标签:

【中文标题】如何在bash中获取当前终端颜色对【英文标题】:how to get current terminal color pair in bash 【发布时间】:2015-03-21 17:06:03 【问题描述】:

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

#!/bin/bash

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

def="\033[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=????

【问题讨论】:

【参考方案1】:

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

两者都是“非标准”(尽管后者,光标位置报告是由任何对“VT100 模拟器”具有有效声明的东西实现的)。

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

OSC 1 1 ? ST

使用XTerm Control Sequences中给出的符号

【讨论】:

【参考方案2】:

了解终端状态与 bash 无关,这一点很重要。巴什不在乎。它只是从stdin 读取并写入stdoutstderr。 (见注1)

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

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

因此,最好的办法是记住所做的更改。

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

注意事项

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

【讨论】:

非常感谢;这似乎很奇怪。它必须存储在某处或其他地方。我曾想过也许在 $PS1 提示字符串中。 @ubundom:我再说一遍,它与 bash 无关。终端仿真器显然保持状态,但它没有办法报告它。巴什不在乎。它只是将您告诉它发送的任何字节发送到标准输出。【参考方案3】:

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

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

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

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

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

【讨论】:

以上是关于如何在bash中获取当前终端颜色对的主要内容,如果未能解决你的问题,请参考以下文章

我的 WSL 终端失去了颜色

如何在bash shell中设置光标颜色[重复]

BASH:如何将终端设置为flash?

如何在我的 Windows git-bash 终端上获得彩色输出?

在 Linux 上显示当前分支和着色(如 Windows 上的 Git Bash)

在 git bash 中更改“暂存这个大块”查询的颜色