You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 21:12:41