从 Makefile 规则打印粗体或彩色文本

Posted

技术标签:

【中文标题】从 Makefile 规则打印粗体或彩色文本【英文标题】:Print bold or colored text from Makefile rule 【发布时间】:2019-05-31 02:05:21 【问题描述】:

我正在尝试从以下Makefile 打印粗体文本:

printf-bold-1:
    @printf "normal text - \e[1mbold text\e[0m"

但是,转义序列是按原样打印的,所以在运行 make printf-bold-1 时,我得到了:

普通文本 - \e[1mbold text\e[0m

而不是预期的:

普通文本 - 粗体文本

这很奇怪,因为我可以从终端打印粗体文本:直接运行命令printf "normal text - \e[1mbold text\e[0m" 会产生预期效果:

普通文本 - 粗体文本

Makefile中,我尝试使用@echoecho代替@printf,或者打印\x1b代替\e,但没有成功。

以下是一些描述我的环境的变量(带有标准 Gnome 终端的 Linux),如果有帮助的话:

COLORTERM=gnome-terminal
TERM=xterm-256color

另请注意,在某些同事的笔记本电脑 (Mac) 上,可以正确打印粗体文本。

什么是可移植的方式,适用于各种环境,从Makefile 规则打印粗体或彩色文本?

【问题讨论】:

我强烈建议你在这里使用单引号,只是为了安全。但是,您的第一个示例在 GNOME 终端和 xterm 中对我(Ubuntu 18.04)运行良好。顺便说一句,您绝对不能使用echo。我不确定你使用不同的 shell 到底是什么意思:make 不在乎你用什么 shell 调用它。它总是使用/bin/sh,除非你将在你的makefile中的SHELL变量设置为不同的东西。 使用简单引号时,可以正确打印粗体文本。不明白为什么,你有解释吗?不管怎么说,还是要谢谢你!我会从问题中删除关于贝壳的部分,因为它具有误导性,我不知道我为什么写这个。 这取决于 printf 是否将 \e 解释为转义序列。 echo 并非没有告诉它的选项:echo -e "\e[1mbold\e[0m" @shawnhcorey 谢谢,但我仍然不确定为什么 printf 有时会将 \e 解释为转义序列(例如在我同事的 Mac 或 @MadScientist 环境中),有时不是(我的环境)。 我无法解释为什么您会看到不同的行为。但是我可以解释为什么单引号和双引号可能会有所不同:在单引号中,shell 在将字符串发送到它运行的程序之前根本不解释字符串(此处为 printf)。在双引号中,shell 确实 解释该字符串以查找特殊字符,例如$、反引号等,以便它可以对它们执行操作。反斜杠是一个特殊字符,因为它可以转义一些东西(如引号),并且 shell 有时会解释反斜杠。取决于外壳。 【参考方案1】:

您应该使用通常的tput 程序为实际终端生成正确的转义序列,而不是硬编码特定的字符串(例如,在 Emacs 编译缓冲区中看起来很难看):

printf-bold-1:
    @printf "normal text - `tput bold`bold text`tput sgr0`"

.PHONY: printf-bold-1

当然,您可以将结果存储到 Make 变量中,以减少子 shell 的数量:

bold := $(shell tput bold)
sgr0 := $(shell tput sgr0)

printf-bold-1:
    @printf 'normal text - $(bold)bold text$(sgr0)'

.PHONY: printf-bold-1

【讨论】:

【参考方案2】:

好的,我明白了。我应该使用 \033 而不是 \e\x1b

printf-bold-1:
    @printf "normal text - \033[1mbold text\033[0m"

或者,按照 cmets 中的建议,使用单引号而不是双引号:

printf-bold-1:
    @printf 'normal text - \e[1mbold text\e[0m'

make printf-bold-1 现在生成:

普通文本 - 粗体文本

【讨论】:

以上是关于从 Makefile 规则打印粗体或彩色文本的主要内容,如果未能解决你的问题,请参考以下文章

Ag Grid 部分单元格格式 - 例如如何在单元格中设置一些文本样式 - 粗体、斜体、彩色(但不是其他文本)

textView 中的粗体/斜体样式文本输入

MFC 中的粗体标签

使 ZPL 标签中的文本加粗或加下划线?

contentEditable div 中的粗体选定文本,使用纯 JavaScript,不使用 jQuery 等库

如何在 Django Administration 中使文本加粗