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

Bash循环生成Bazel命令时路径重复及缺失问题排查

问题

我需要生成无重复路径的bazel coverage命令,但当前脚本输出的命令存在路径重复;另外,我也搞不懂为什么第二次迭代会出现路径缺失。

原Bash脚本

#!/bin/bash
set -x
loop_array_for_bazel_coverage_single_path_ata_time () {
    bazel_apps_str="src/common/udc/cli src/common/udc/go/client src/common/udc/go/client/mocks"
    bazel_apps_array=("$bazel_apps_str")
    #set prefix and postfix to each element in array
    for paths_index in "${!bazel_apps_array[@]}"
    do  
        bazel_first_param=${bazel_apps_array[$paths_index]}
        bazel_param_second_array=("${bazel_apps_array[@]}")
        unset 'bazel_param_second_array[$paths_index]'
        string_var=$( IFS=$'\n'; echo "${bazel_param_second_array[*]}" )
        new=( "$(find "$string_var" -type f -name 'BUILD.bazel' -printf '-//%h/...\n')" )
        printf "\nbazel coverage //%s/... %s" "$bazel_first_param" "${new[@]}"
    done
}
loop_array_for_bazel_coverage_single_path_ata_time

执行输出

./tt.sh

bazel coverage //src/common/udc/cli/... -//src/common/udc/go/client/... -//src/common/udc/go/client/mocks/... -//src/common/udc/go/client/mocks/...

bazel coverage //src/common/udc/go/client/... -//src/common/udc/cli/... -//src/common/udc/go/client/mocks/...

bazel coverage //src/common/udc/go/client/mocks/... -//src/common/udc/cli/... -//src/common/udc/go/client/... -//src/common/udc/go/client/mocks/...

问题根源

  1. 数组初始化错误:原脚本中bazel_apps_array=("$bazel_apps_str")把整个字符串作为数组的单个元素,而非拆分成三个独立路径元素,导致后续循环和数组操作逻辑混乱,引发重复路径和异常输出。
  2. 冗余的find命令:通过find查找BUILD.bazel生成排除路径时,父目录(如src/common/udc/go/client)会包含子目录(mocks)的BUILD文件,导致find同时输出父、子目录的排除项,造成重复。

修复后的脚本

#!/bin/bash
set -x
loop_array_for_bazel_coverage_single_path_ata_time () {
    bazel_apps_str="src/common/udc/cli src/common/udc/go/client src/common/udc/go/client/mocks"
    # 正确拆分字符串为数组元素
    bazel_apps_array=($bazel_apps_str)
    for paths_index in "${!bazel_apps_array[@]}"
    do  
        bazel_first_param=${bazel_apps_array[$paths_index]}
        # 复制数组并移除当前主路径元素
        bazel_param_second_array=("${bazel_apps_array[@]}")
        unset 'bazel_param_second_array[$paths_index]'
        # 直接为剩余路径添加排除前缀和后缀
        exclude_paths=()
        for path in "${bazel_param_second_array[@]}"
        do
            exclude_paths+=("-//${path}/...")
        done
        # 输出最终命令
        printf "\nbazel coverage //%s/... %s" "$bazel_first_param" "${exclude_paths[*]}"
    done
}
loop_array_for_bazel_coverage_single_path_ata_time

修复后的输出

./tt.sh

bazel coverage //src/common/udc/cli/... -//src/common/udc/go/client/... -//src/common/udc/go/client/mocks/...

bazel coverage //src/common/udc/go/client/... -//src/common/udc/cli/... -//src/common/udc/go/client/mocks/...

bazel coverage //src/common/udc/go/client/mocks/... -//src/common/udc/cli/... -//src/common/udc/go/client/...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:37:44