Mac M2环境下Makefile与Shell执行openssl命令结果不一致求助
问题解决:Mac M2上Makefile与直接Shell执行命令结果不一致
问题背景
在Mac M2(arm64)环境下,执行Makefile中的openssl哈希命令,结果和直接在终端Shell执行相同命令的输出不一致,但在amd64架构的Ubuntu环境中两者结果一致。
Makefile内容:
foo: echo -n "d41d8cd98f00b204e9800998ecf8427e" | openssl dgst -md5 -hmac "1@123456"
执行差异:
# Make执行结果 MacBook-Air:tmp $ make foo echo -n "d41d8cd98f00b204e9800998ecf8427e" | openssl dgst -md5 -hmac "1@123456" b6977416b3597483a9e416f4c04a1dcd # 直接Shell执行结果 MacBook-Air:tmp$ echo -n "d41d8cd98f00b204e9800998ecf8427e" | openssl dgst -md5 -hmac "1@123456" 44ac6a36a27b1e5352a14e803929516f
根本原因
Make默认使用系统的/bin/sh作为执行命令的Shell,而Mac上的/bin/sh是POSIX标准兼容的Shell,它的echo命令不支持-n参数——会把-n当作输出字符串的一部分传递给后续命令;而你直接在终端使用的是Mac默认的zsh(或bash),这些Shell的echo命令支持-n参数,会忽略换行输出目标字符串。
两者传递给openssl的输入内容完全不同:
- Make中实际输入:
-n d41d8cd98f00b204e9800998ecf8427e(带-n前缀) - 直接Shell执行输入:
d41d8cd98f00b204e9800998ecf8427e(无-n,无换行)
这就导致了哈希结果的差异。而Ubuntu上的/bin/sh是bash的链接,bash的echo支持-n,所以两者结果一致。
解决方案
方案1:指定Make使用与终端相同的Shell
在Makefile开头添加一行,指定使用zsh或bash:
SHELL := /bin/zsh # 或者 SHELL := /bin/bash foo: echo -n "d41d8cd98f00b204e9800998ecf8427e" | openssl dgst -md5 -hmac "1@123456"
方案2:改用POSIX标准的printf替代echo -n
printf是POSIX标准命令,所有兼容Shell的行为一致,不会出现参数差异问题:
foo: printf "%s" "d41d8cd98f00b204e9800998ecf8427e" | openssl dgst -md5 -hmac "1@123456"
验证方法
可以通过输出内容确认差异:
- Make中执行
echo -n "test",实际输出是-n test - 直接Shell执行
echo -n "test",实际输出是test(无换行)
内容的提问来源于stack exchange,提问作者fxx
相关产品推荐
相关产品推荐

