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