如何将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
相关产品推荐
相关产品推荐

