如何在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
读取并写入stdout
和stderr
。 (见注1)
所有终端效果都是由你碰巧使用的终端模拟器实现的,其中有很多。例如,在图形环境中,您可能正在使用xterm
或konsole
。您需要在这些模拟器的文档中搜索它们解释的特定终端控制代码。
据我所知,除了光标位置(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中获取当前终端颜色对的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的 Windows git-bash 终端上获得彩色输出?