我想在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=????
答案 0 :(得分:6)
问题是当前的颜色,而不是光标位置。
两者都是“非标准”(尽管后者,光标位置报告是由对“VT100模拟器”有效声明的任何内容实现的。)
但是,xterm实现了一组转义序列,称为动态颜色,它早于ANSI颜色功能。那些设置工作颜色包括文本前景和背景。我在2002中对此进行了修改,以允许应用程序使用“?”发送序列而不是告诉xterm返回颜色值的颜色,例如,
OSC 1 1 ? ST
中给出的符号
答案 1 :(得分:4)
了解终端状态与bash 无关,这一点非常重要。巴什并不关心。它只是从stdin
读取并写入stdout
和stderr
。 (见注1)
所有终端效果都是由您正在使用的终端仿真器实现的,其中有很多。在图形环境中,您可能正在使用,例如xterm
或konsole
。您需要在文档中搜索那些他们解释的特定终端控制代码的仿真器。
据我所知,除光标位置外,没有标准代码可以获取当前终端状态的报告( ESC [ 6 名词)。
所以,最好的办法是记住你制作时所做的改变。
您可以使用man console_codes
找到Linux控制台实施的标准代码列表(尽管现在很少有人使用Linux控制台);其中大多数也由xterm
和其他图形控制台解释。在Thomas Dickey的xterm site中列出了xterm
序列;它实际上是终端仿真器的标准,但正如我所说,你需要在每个仿真器的文档中搜索特殊的控制序列。
bash
使用名为readline
的库来帮助它处理某些终端效果。特别是,readline
尝试维护当前控制台光标位置,尽管很容易欺骗它。在PS1
中,您需要使用\[
和\]
来控制控制台控制序列,因为readline
不知道它们是控制序列。答案 2 :(得分:4)
你不能;没有标准的控制序列来报告当前的游标属性。
的存在是一个保存和恢复当前光标位置和属性的序列:
\e7
(DECSC)将保存光标位置和属性。\e8
(DECRC)将恢复已保存的光标位置和属性。没有标准的方法来恢复仅游标属性;但是,正如rici所提到的,您可以使用\e[6n
(DSR)获取当前位置的报告,然后使用响应手动"取消恢复"恢复其位置和属性后的光标位置。
但是,再一次,只是跟踪应用程序中的颜色可能更容易(也更好),而不是让终端对此负责。