在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
相关产品推荐
相关产品推荐

