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

在Bash脚本中调用GitHub API从Tag拉取文件异常问题排查

问题原因

CircleCI默认使用Dash作为shell解释器,而本地环境通常采用Bash,两者对curl命令的参数解析存在差异。你的npm脚本中,curl依赖-O参数自动提取文件名,但在Dash环境下,带查询字符串?ref=0.1.0的URL会被完整当作文件名,导致下载test.json?ref=0.1.0而非预期的test.json。同时,npm脚本的引号嵌套逻辑在Dash下未被正确处理,进一步导致URL的查询参数未被识别为URL的一部分,反而成为文件名的组成部分。

修复方案

方案1:手动指定输出文件名(最稳妥)

放弃-O自动提取文件名的逻辑,改用-o参数直接指定输出为test.json,彻底规避shell环境差异带来的解析问题:

...
"scripts": {
  "fetch-tests": "ls -al && curl -L -f -o test.json 'https://api.github.com/repos/<mycompany>/<myrepo>/contents/test.json?ref=0.1.0' -H 'Accept: application/vnd.github.v3.raw' -H \"Authorization: token ${GITHUB_TOKEN}\" && ls -al",
...

方案2:强制用Bash执行脚本

在npm脚本中明确指定用Bash解释命令,消除Dash与Bash的解析差异:

...
"scripts": {
  "fetch-tests": "bash -c 'ls -al && curl -L -O -f \"https://api.github.com/repos/<mycompany>/<myrepo>/contents/test.json?ref=0.1.0\" -H \"Accept: application/vnd.github.v3.raw\" -H \"Authorization: token ${GITHUB_TOKEN}\" && ls -al'",
...

方案3:调整引号写法

将URL的单引号改为双引号,确保整个curl命令的引号嵌套在shell中正确解析(适合熟悉shell引号规则的场景):

...
"scripts": {
  "fetch-tests": "ls -al && curl -L -O -f \"https://api.github.com/repos/<mycompany>/<myrepo>/contents/test.json?ref=0.1.0\" -H \"Accept: application/vnd.github.v3.raw\" -H \"Authorization: token ${GITHUB_TOKEN}\" && ls -al",
...

注:方案1是最推荐的,它不依赖shell环境差异,直接固定输出文件名,能避免后续环境变化引发类似问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:22:11