从 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
中,我尝试使用@echo
或echo
代替@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 部分单元格格式 - 例如如何在单元格中设置一些文本样式 - 粗体、斜体、彩色(但不是其他文本)