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

Github Action中jq提取JSON值后Bash命令执行异常问题

问题分析

你的错误根源有两个:

  1. 错误的管道与变量赋值结合:prId='${{ ... }}' | jq ...这种写法中,Bash会将变量赋值作为独立命令执行(无输出),并将后续通过反斜杠连接的echo命令当作jq的参数,导致jq误以为要打开名为echo的文件,触发“Could not open file”错误。
  2. 管道子shell变量隔离:即使你用分号分隔命令,管道左侧的变量赋值是在子shell中完成的,父shell无法访问这个变量,所以后续echo "$prId"会输出空值。

另外,多个独立的jq调用可以合并为一个,既提升效率又更易维护。

修正后的GitHub Action步骤
- name: Get waiting pull_request_id
  id: get_pr_id
  run: |
    # 合并jq查询,用$()捕获输出赋值给prId
    prId=$(echo '${{ steps.get_in_progress_workflow_run.outputs.data }}' | jq -r '
      .workflow_runs[] 
      | first(select(.status=="in_progress")) 
      | .pull_requests 
      | first 
      | .number
    ')
    # 将结果写入GITHUB_OUTPUT
    echo "prId=$prId" >> $GITHUB_OUTPUT
关键修改说明
  • 用$()捕获命令输出:替代管道+赋值的错误写法,确保变量在当前shell中被正确赋值,避免子shell隔离问题。
  • 合并jq查询:把多个jq调用合并为一个链式查询,减少进程创建开销,逻辑更清晰。
  • 添加-r参数:让jq输出原始字符串(不带引号),避免后续使用时处理多余的引号。
  • 合理换行:jq支持查询语句内的换行(忽略空白字符),用换行拆分查询逻辑,提升可读性,无需额外反斜杠。
简化版(单行)

如果偏好紧凑写法,也可以写成单行:

- name: Get waiting pull_request_id
  id: get_pr_id
  run: |
    prId=$(echo '${{ steps.get_in_progress_workflow_run.outputs.data }}' | jq -r '.workflow_runs[] | first(select(.status=="in_progress")) | .pull_requests | first | .number')
    echo "prId=$prId" >> $GITHUB_OUTPUT

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:50:25