22

我正在编写各种实用程序,而且我真的很喜欢彩色文本。没什么特别的,只是使用转义序列。我创建了一个具有 pprint(msg, color) 函数的简单类。在这里找到代码后,我已经很容易地工作了。

我遇到的问题是我应该能够在打印后关闭颜色。例如,假设用户运行我的程序,该程序以默认终端颜色打印几乎所有内容,但出现错误,我想以红色打印错误。我在我的错误消息前面加上'\033[0;32m',并且消息是红色的。不幸的是,在我更改之前,所有文本都是红色的。在我的程序运行时这通常很好,因为我知道消息应该是什么颜色。但是,我的程序结束后颜色仍然存在。基本上,我想在程序启动时读取当前颜色,并在完成后恢复它。与脚本在退出时恢复密码的方式相同。

如何读取当前的转义序列?

系统:Red Hat 5.x Bash Python 2.3

谢谢您的帮助。

4

4 回答 4

122

与其使用混淆转义序列,不如使用该tput工具。~/.bashrc这是我用于 PS1 提示的摘录:

BLACK=$(tput setaf 0)
RED=$(tput setaf 1)
GREEN=$(tput setaf 2)
YELLOW=$(tput setaf 3)
LIME_YELLOW=$(tput setaf 190)
POWDER_BLUE=$(tput setaf 153)
BLUE=$(tput setaf 4)
MAGENTA=$(tput setaf 5)
CYAN=$(tput setaf 6)
WHITE=$(tput setaf 7)
BRIGHT=$(tput bold)
NORMAL=$(tput sgr0)
BLINK=$(tput blink)
REVERSE=$(tput smso)
UNDERLINE=$(tput smul)

要重置颜色信息以使后续文本采用正常的终端颜色,您可以${NORMAL}像这样附加到末尾:

echo "${RED}this is red ${NORMAL}this is normal"

于 2010-12-02T07:07:19.367 回答
5

实际上,对于 xterm兼容的终端,这是可能的。

例如xtermcontrol使用OSC 10控制序列来检索默认的前景色/背景色。自 2002 年以来,它已记录在 xterm 中。

对于其他终端:

  • 在 RHEL 5 中,“终端”程序是 gnome-terminal 2.16.0;该版本无法识别OSC 10(使用等效的 CentOS 5 测试)。
  • 这个问题是在 2010 年提出的,指的是 Red Hat企业版,如果有的话,它的更新速度比 Debian 慢。
  • 随着时间的推移,Debian 7(2012 年初)上的 gnome-terminal 3.4.1.1 也无法识别控制序列。
  • 最后,在带有 3.14.1(2014 年末)的 Debian 8 中,该功能得到了认可。
  • CentOS 7 的 gnome-terminal 3.14.3 识别控制序列。

当它被添加时很好奇,请记住 VTE 的开发人员不编写文档。所以...研究 git log 显示

commit 1b8c6b1aac587b79476a60a5830385abc939430d 
Author: Egmont Koblinger <egmont@gmail.com> 
Date:   Wed Jan 22 00:13:51 2014 +0100

    emulation: Add support for OSC 1?1[017] (fg, bg, highlight colors)

    https://bugzilla.gnome.org/show_bug.cgi?id=567444

另一方面,默认颜色与当前颜色不同。自1999 年补丁 #93以来,用户已经能够使用 xterm使用DECRQSS控制序列执行此操作。也就是说,将终端置于原始模式并执行类似的操作

printf '\033P$m\033\\'

会让它回复用 SGR 参数填充的字符串。

如果使用 SGR 设置颜色,则这些代码将成为回复的一部分,例如

\033P1$r0;33m\033\\

表示前景色编号 3(编码为33)。

您可以停在那里(因为您可以提取这些参数并在以后重新使用它们将终端设置为相同的状态),但随后可以使用OSC 4. 您将使用颜色编号(来自 SGR 序列),并发送如下内容:

printf '\033]4;3;?\033\\'

所以用 xterm 肯定是可行的。DECRQSS在xterm 的下一次更新中将有一个演示/测试脚本。

对于其他程序,您需要更多时间:

  • xtermcontrol 的开发人员忽略DECRQSS了(它没有设置/获取 SGR 代码的功能)。

  • VTE 的开发人员复制 xterm 功能以响应错误报告;VTE 消息来源未提及DECRQSS。它的 git logOSC 4在 2009 年提到,但实现不完整(它只允许设置颜色,不能获取颜色)。

于 2017-01-22T19:59:20.493 回答
4
RED = 31
GREEN = 32
ESCAPE = '%s[' % chr(27)
RESET = '%s0m' % ESCAPE
FORMAT = '1;%dm'

def colorize(text, color):
    return ESCAPE + (FORMAT % (color, )) + text + RESET

此函数将返回一个字符串,该字符串将打印彩色,之后终端会自动重置。

于 2010-12-02T07:15:50.290 回答
4

我不相信这是可能的,如果是的话,它不太可能是便携的。您可以做的最好的事情是发送sgr0将所有属性重置为默认值(不是以前的)。在 xterms 上,sgr0Esc[m. 如果要重置颜色而不影响其他属性,请op在 xterms 上发送 which is Esc[39;49m

这些代码不应被硬编码。您应该使用 terminfo、termcap 或 [n]curses。

于 2010-12-02T11:48:22.510 回答