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

时间:2015-01-22 19:04:10

标签: bash ansi-colors

我想在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=????

3 个答案:

答案 0 :(得分:6)

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

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

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

OSC 1 1 ? ST

使用XTerm Control Sequences

中给出的符号

答案 1 :(得分:4)

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

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

据我所知,除光标位置外,没有标准代码可以获取当前终端状态的报告( ESC [ 6 名词)。

所以,最好的办法是记住你制作时所做的改变。

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

注释

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

答案 2 :(得分:4)

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

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

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

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

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