Github Action中jq提取JSON值后Bash命令执行异常问题
问题分析
你的错误根源有两个:
- 错误的管道与变量赋值结合:
prId='${{ ... }}' | jq ...这种写法中,Bash会将变量赋值作为独立命令执行(无输出),并将后续通过反斜杠连接的echo命令当作jq的参数,导致jq误以为要打开名为echo的文件,触发“Could not open file”错误。 - 管道子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
相关产品推荐
相关产品推荐

