【问题标题】:how to get current terminal color pair in bash如何在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=????

【问题讨论】:

    标签: bash ansi-colors


    【解决方案1】:

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

    两者都是“非标准”(尽管后者,光标位置报告是由任何对“VT100 模拟器”具有有效声明的东西实现的)。

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

    OSC 1 1 ? ST
    

    使用XTerm Control Sequences中给出的符号

    【讨论】:

      【解决方案2】:

      了解终端状态与 bash 无关,这一点很重要。巴什不在乎。它只是从stdin 读取并写入stdoutstderr。 (见注1)

      所有终端效果都是由你碰巧使用的终端模拟器实现的,其中有很多。例如,在图形环境中,您可能正在使用xtermkonsole。您需要在这些模拟器的文档中搜索它们解释的特定终端控制代码。

      据我所知,除了光标位置(ESC[6 n)。

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

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

      注意事项

      1. 在交互模式下,bash 使用一个名为readline 的库来帮助它处理一些终端效果。特别是,readline 试图保持当前控制台光标位置,尽管它很容易被欺骗。在PS1 中,您需要用\[\] 包围控制台控制序列,因为readline 不知道它们是控制序列。

      【讨论】:

      • 非常感谢;这似乎很奇怪。它必须存储在某处或其他地方。我曾想过也许在 $PS1 提示字符串中。
      • @ubundom:我再说一遍,它与 bash 无关。终端仿真器显然保持状态,但它没有办法报告它。巴什不在乎。它只是将您告诉它发送的任何字节发送到标准输出。
      【解决方案3】:

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

      然而,确实存在的是一个用于保存和恢复当前光标位置和属性的序列:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-27
        • 2021-01-24
        • 2017-06-25
        • 1970-01-01
        • 2020-04-21
        相关资源
        最近更新 更多