【发布时间】:2021-09-14 14:01:20
【问题描述】:
printf 程序可用于打印二进制数据,例如:
$ printf '%b' '\xff\xff'
��
如果我把它单独放在 Makefile 中,它的工作原理是一样的:
all:
printf '%b' '\xff\xff'
$ make
printf '%b' '\xff\xff'
��
但是,如果我想在 Makefile 中的同一个 shell 调用上做任何其他事情,例如将它重定向到一个文件,或者只是在之后打印其他东西,那么尽管 Make 打印的命令没有改变(建议这不是转义问题),但输出变为反斜杠,后跟“x”,后跟双“f”,两次:
all:
printf '%b' '\xff\xff'; printf 'wtf?\n'
make
printf '%b' '\xff\xff'; printf 'wtf?\n'
\xff\xffwtf?
这里发生了什么?为什么一行中的两个 printfs 与单个 printf 的行为不同?
【问题讨论】:
-
printf是许多 shell 中内置的;您可能正在使用bash作为您的交互式shell,但make正在使用您的系统默认shell,它可能不是bash。因此,有两个不同的printf命令。 -
@chepner 但这如何解释两个
Makefiles 之间的不同printf行为? -
这是一个疯狂的猜测,但我怀疑
make应用了某种优化,导致第一个示例作为一个简单的命令执行第三个选项,实际的二进制@ 987654337@(可能在/usr/bin中找到),而不是shell。在您的第二个示例中,;强制make使用 shell 执行 shell 命令行。
标签: shell makefile printf escaping quoting