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

如何将Bash变量传递给Bazel的set查询命令

问题原因

你的需求完全可以用变量存储结果的方案实现,报错是Shell的字符串解析规则导致的:

单引号包裹的字符串会完全保留字面量,不会执行变量替换、命令替换操作。

你写的bazel query --keep_going 'set(${res})'中,${res}被单引号包裹,Shell根本不会把它替换成你之前存储的文件列表,Bazel接收到的参数就是字面的set(${res}),自然会把$、{res、}识别为独立的目标去解析,就出现了你看到的报错。

修正方案

把单引号替换为双引号即可,双引号包裹的字符串会正常执行变量展开:

res=$(git diff --name-only ${COMMIT_HASH}^! | grep '^src/' | uniq | cut -d/ -f2-)
bazel query --keep_going "set(${res})"

如果你的文件名可能包含空格、换行等特殊字符,可以用数组存储结果,避免解析异常:

# 按行存储git返回的文件名,兼容特殊字符场景
mapfile -t res < <(git diff --name-only ${COMMIT_HASH}^! | grep '^src/' | uniq | cut -d/ -f2-)
bazel query --keep_going "set(${res[*]})"

另外补充说明:你提到的直接把git命令嵌入bazel query的写法同样存在单引号问题,实际执行时Shell不会替换单引号内的$(git ...)命令结果,你能跑通大概率是实际使用时误写为双引号导致的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:36:01