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

Makefile中ASSETURL变量赋值后失效,curl命令执行失败求助

问题修复方案

问题重现

在Makefile中通过curl请求GitHub API,结合jq解析结果赋值给ASSETURL变量,控制台已打印出正确的URL,但后续使用该变量的curl命令执行时提示“未指定URL”,导致make任务失败。

原代码片段:

ASSETURL="$$(curl -X GET -H "Authorization: token ${GHE_TOKEN_FIPS}" "https://github.xxx.com/api/v3/repos/test-registry/base/releases/latest" | jq -r '.assets[0].url')"
@echo "$${ASSETURL}"
@echo $${ASSETURL}
curl -H "Authorization: token ${GHE_TOKEN_FIPS}" -H "Accept: application/octet-stream" -L $$ASSETURL > base.image

控制台输出显示ASSETURL已正确获取到URL,但执行curl时仍报错。

问题原因

Makefile默认会为每一行命令启动一个独立的shell进程,这意味着第一行赋值的ASSETURL变量只在该行的shell中有效,后续行的shell进程无法读取到这个变量,所以执行curl时$$ASSETURL会被解析为空,导致“未指定URL”的错误。

修复方案

将所有需要共享变量的命令合并到同一个shell进程中执行,有两种常见方式:

方式1:用分号连接命令,写在同一行

@ASSETURL="$$(curl -X GET -H "Authorization: token ${GHE_TOKEN_FIPS}" "https://github.xxx.com/api/v3/repos/test-registry/base/releases/latest" | jq -r '.assets[0].url')"; echo "$${ASSETURL}"; curl -H "Authorization: token ${GHE_TOKEN_FIPS}" -H "Accept: application/octet-stream" -L $$ASSETURL > base.image

方式2:用反斜杠\将多行命令连接成一个shell执行块

@ASSETURL="$$(curl -X GET -H "Authorization: token ${GHE_TOKEN_FIPS}" "https://github.xxx.com/api/v3/repos/test-registry/base/releases/latest" | jq -r '.assets[0].url')"; \
echo "$${ASSETURL}"; \
curl -H "Authorization: token ${GHE_TOKEN_FIPS}" -H "Accept: application/octet-stream" -L $$ASSETURL > base.image

补充说明

  • 加上@前缀可以避免Makefile打印出命令本身,只显示命令的执行输出;
  • 使用$$是为了在Makefile中传递单个$给shell,让shell解析变量;
  • 确保jq的-r参数正确使用,避免URL带引号(原代码中已经用了-r,这部分是对的)。

内容的提问来源于stack exchange,提问作者ambikanair

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:35:19