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