【发布时间】: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 有时会解释反斜杠。取决于外壳。
标签: makefile gnu-make gnome-terminal ansi-colors