【问题标题】:Print bold or colored text from Makefile rule从 Makefile 规则打印粗体或彩色文本
【发布时间】: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 有时会解释反斜杠。取决于外壳。

标签: makefile gnu-make gnome-terminal ansi-colors


【解决方案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 现在生成:

    普通文本 - 粗体文本

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 2012-03-20
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 2012-09-28
      • 2013-06-22
      • 1970-01-01
      相关资源
      最近更新 更多