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

在Makefile中用curl与jq解析GitHub API JSON响应报错求助

在Makefile中直接管道curl输出给jq解析JSON的问题解决

在Makefile中尝试解析GitHub API返回的JSON时,将curl结果存入变量再通过echo传递给jq会触发如下报错:

Invalid string: control characters from U+0000 through U+001F must be escaped 
at line 322, column 22

但将curl输出保存到文件后再通过cat传递给jq就能正常运行,目标是实现直接管道传递无需中间文件。

问题原因

Makefile的shell环境下,使用echo "$${json}"传递JSON内容时,echo会自动处理其中的换行、控制字符(比如转义或添加额外换行),导致JSON的原始结构被破坏,jq无法正确解析格式。而直接通过管道传递curl的原始输出,或者写入文件后读取,能完整保留JSON的原始格式,避免解析错误。

解决方案

去掉中间变量存储步骤,直接将curl的输出管道给jq,让原始JSON流直接进入jq处理,修改后的Makefile代码如下:

get_assets:
    @curl -s "https://api.github.com/repos/realm/realm-swift/releases/latest" | jq -r '.assets[] | .name, .browser_download_url' | while read -r name ; do \
        read -r url; \
        echo "$$name" "$$url"; \
    done

备选方案(若需保留变量存储)

如果必须将curl结果存入变量,可使用printf '%s'代替echo,因为printf '%s'会原样输出变量内容,不会处理特殊字符:

get_assets:
    @json=$$(curl -s "https://api.github.com/repos/realm/realm-swift/releases/latest"); \
    printf '%s' "$${json}" | jq -r '.assets[] | .name, .browser_download_url' | while read -r name ; do \
        read -r url; \
        echo "$$name" "$$url"; \
    done

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:18:18