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/...
问题根源
- 数组初始化错误:原脚本中
bazel_apps_array=("$bazel_apps_str")把整个字符串作为数组的单个元素,而非拆分成三个独立路径元素,导致后续循环和数组操作逻辑混乱,引发重复路径和异常输出。 - 冗余的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
相关产品推荐
相关产品推荐

