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


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

8225
2018-01-22 19:04


起源



答案:


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

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

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

OSC 1 1 ? ST

使用中给出的符号 XTerm控制序列


6
2018-02-05 01:27





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

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

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

没有标准的恢复方法 只要 游标属性;然而,正如里奇所提到的,你可以使用获得当前位置的报告 \e[6n (DSR),然后使用响应在恢复其位置和属性后手动“取消恢复”光标位置。

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


4
2018-01-22 19:55





了解终端状态有重要意义 与bash无关。 Bash不关心。它只是从中读取 stdin 并写信给 stdout 和 stderr。 (见注1)

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

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

因此,最好的办法是记住制作时所做的更改。

您可以找到Linux控制台使用的标准代码列表 man console_codes (虽然现在很少有人使用Linux控制台);其中大部分也被解释 xterm 和其他图形控制台。有一个清单 xterm Thomas Dickey的序列 xterm网站;它是终端仿真器或多或少事实上的标准,但正如我所说,你需要在每个仿真器的文档中搜索特殊的控制序列。

笔记

  1. 在交互模式下, bash 使用一个名为的库 readline 帮助它处理一些终端效应。尤其是, readline 尝试维护当前控制台光标位置,虽然很容易欺骗它。在 PS1 您需要使用控制台控制序列 \[ 和 \] 正是因为 readline 不知道它们是控制序列。

4
2018-01-22 19:20



非常感谢;这看起来很奇怪。它必须存储 某处 或其他。我曾想过可能在$ PS1提示字符串中。 - ubundom
@ubundom:我再说一遍,它有 与bash无关。终端模拟器显然保持状态,但它没有办法报告它。 Bash不关心。它只是向stdout发送你告诉它发送的任何字节。 - rici


答案:


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

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

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

OSC 1 1 ? ST

使用中给出的符号 XTerm控制序列


6
2018-02-05 01:27





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

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

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

没有标准的恢复方法 只要 游标属性;然而,正如里奇所提到的,你可以使用获得当前位置的报告 \e[6n (DSR),然后使用响应在恢复其位置和属性后手动“取消恢复”光标位置。

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


4
2018-01-22 19:55





了解终端状态有重要意义 与bash无关。 Bash不关心。它只是从中读取 stdin 并写信给 stdout 和 stderr。 (见注1)

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

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

因此,最好的办法是记住制作时所做的更改。

您可以找到Linux控制台使用的标准代码列表 man console_codes (虽然现在很少有人使用Linux控制台);其中大部分也被解释 xterm 和其他图形控制台。有一个清单 xterm Thomas Dickey的序列 xterm网站;它是终端仿真器或多或少事实上的标准,但正如我所说,你需要在每个仿真器的文档中搜索特殊的控制序列。

笔记

  1. 在交互模式下, bash 使用一个名为的库 readline 帮助它处理一些终端效应。尤其是, readline 尝试维护当前控制台光标位置,虽然很容易欺骗它。在 PS1 您需要使用控制台控制序列 \[ 和 \] 正是因为 readline 不知道它们是控制序列。

4
2018-01-22 19:20



非常感谢;这看起来很奇怪。它必须存储 某处 或其他。我曾想过可能在$ PS1提示字符串中。 - ubundom
@ubundom:我再说一遍,它有 与bash无关。终端模拟器显然保持状态,但它没有办法报告它。 Bash不关心。它只是向stdout发送你告诉它发送的任何字节。 - rici