shell脚本小练习#005:exec.sh

# 22024.12.08
# 查找编译好的可执行文件,并执行测试,将执行的打印信息打印到log文件中
# 串行执行
#!/bin/bash

# 定义一个全局变量,用于保存查找到的 build.sh 文件路径
exec_files_paths=()
# 定义一个全局变量,用于保存查找到的 build.sh 文件所在的目录
exec_file_dirs=()
test_cases_path=""

function find_test_cases() {
    local parent="$(pwd)"
    while [[ "$parent" != "/" ]]; do
        if [[ -d "$parent/testCases" ]]; then
            test_cases_path="$parent/testCases"
            break
        fi
        parent="$(dirname "$parent")"
    done

    if [[ -n "$test_cases_path" ]]; then
        echo "Found testCases directory at $test_cases_path"
    else
        echo "Could not find testCases directory"
    fi
}

# 查找 testCases 目录下所有子目录中的 build.sh 文件,并将它们的路径存入全局变量数组 exec_files_paths 中
function find_exec_files() {
  local test_cases_path=$1
  exec_files_paths=($(find "$test_cases_path" -type f -name "star" -exec printf "%s\n" {} +))
  for file_path in "${exec_files_paths[@]}"; do
    build_sh_dir=$(dirname "$file_path")
    exec_file_dirs+=("$build_sh_dir/")
  done
  echo "Found ${#exec_files_paths[@]} build.sh files"
}

# 打印全局变量数组 exec_files_paths 中存储的所有 build.sh 文件路径以及对应的目录
function print_exec_files_paths() {
  echo "Build.sh file paths and directories:"
  for ((i=0; i < ${#exec_files_paths[@]}; i++)); do
    echo "$i. "
    echo "   Directory: ${exec_file_dirs[$i]}"
    echo "   File path: ${exec_files_paths[$i]}"
  done
}

# 逐个进入全局变量数组 exec_file_dirs 中的所有目录,执行目录下的star
# 可以使用 `&` 符号将命令放在后台执行,然后使用 `wait` 命令等待所有后台任务执行完毕。修改代码如下:
# function execute_build_sh_files() {
#     for dir_path in "${exec_file_dirs[@]}"; do
#         (
#           cd "$dir_path" && stdbuf -oL ./star > >(tee -a log.txt > /dev/null)
#         ) &
#     done
#     # wait
# }
function execute_build_sh_files() {
    today=$(date +%Y%m%d)
    for dir_path in "${exec_file_dirs[@]}"; do
        # 获取第一级目录名
        first_level_dir=$(basename "$(dirname "$(dirname "$dir_path")")")
        
        # 构造日志文件路径
        log_file_path="$dir_path/${today}_${first_level_dir}.log"
        # 在子shell中执行命令,并重定向输出
        (
            cd "$dir_path" && stdbuf -oL ./star | tee -a "$log_file_path" >/dev/null
        ) &
    done
    # wait
}

function execute_test_cases_build_sh_files() {
  local parent="$(pwd)"
  while [[ "$parent" != "/" ]]; do
   if [[ -d "$parent/testCases" ]]; then
      local test_cases_path="$parent/testCases"
      execute_build_sh_files
      return
   fi
   parent="$(dirname "$parent")"
  done
  echo "Could not find testCases directory"
}

# 查找 testCases 目录,并调用查找函数和打印函数
function main() {
    # 22024.12.08
    find_test_cases
    find_exec_files $test_cases_path
    # find_exec_files "$test_cases_path"
    print_exec_files_paths
    execute_test_cases_build_sh_files
}

# 调用主函数
main

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值