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

Bash脚本第二次迭代无法读取repos_filtered_blob.json文件

问题描述

Bash循环脚本首次迭代能正常读取repos_filtered_blob.json文件,但第二次迭代时提示无法访问该文件,脚本创建此文件后未做任何修改,怀疑是less命令造成文件锁定。

脚本代码

while [ $REPOS_COUNT -gt 0 ]

do

    echo "Getting the repo name to be deployed..."

    REPO_NAME=$( jq -r .[$i].Name repos_filtered_blob.json)

    echo "Repository name: $REPO_NAME"


    echo "Checking if the repo should be deployed to $ENVIRONMENT environment..."
    echo "$ENVIRONMENT environment detected! Extracting the source branch name..."

    BRANCH_NAME=$(less repos_filtered_blob.json | jq -r '.['$i'].BRANCH')
    echo "Source branch name: $BRANCH_NAME"
    REPO_LINK=$( jq -r .[$i].Link repos_filtered_blob.json)



    echo "Repository LINK: $REPO_LINK"
    ADJUSTED_LINK=$(echo $REPO_LINK | sed "s,https://.*@,https://$TOKEN@,g")
    echo "Adjusted link: $ADJUSTED_LINK"
    REPO_SSH=$( jq -r .[$i].SSH repos_filtered_blob.json)

    echo ""
    CONTAINER_NAME=$( jq -r .[$i].PATH repos_filtered_blob.json)
    echo "Container name: $CONTAINER_NAME"

    echo "Cloning the source branch..."

    rm -rf $REPO_NAME
    git clone --branch $BRANCH_NAME --single-branch https://$TOKEN@dev.azure.com/sonova-retail${ADJUSTED_LINK#https://sonova-retail.visualstudio.com}



    echo "Checking if the repository had recent commits..."
    cd $REPO_NAME

    if git log --date=relative --since "2 months ago" | grep -q commit; 
    then
        echo "Repository edited recently, will proceed with copying..."
        cd ..
        echo "Saving the list of the contents..."
        ls $REPO_NAME/ > contents.txt
        cat contents.txt
        echo "Deleting the pre-existing folders from the container..."
        az storage blob delete-batch --auth-mode login --account-name $STORAGE_ACCOUNT_NAME -s $CONTAINER_NAME
        ./azcopy rm "https://$STORAGE_ACCOUNT_NAME.blob.core.windows.net/$CONTAINER_NAME" --recursive=true --list-of-files=contents.txt
        
        
        if [ "$REPO_NAME" = "DIF-SO-data-governance" ];
        then
            echo "Checking which env folder can be deleted from DIF_data_governance"
            ENVIRONMENT_FOLDERS=$(ls ../../DIF-SO-data-governance/$ENVIRONMENT/data_ingestion_framework/)
            TO_DELETE=("${ENVIRONMENT_FOLDERS[@]/$ENVIRONMENT}")
            for FOLDER in ${TO_DELETE[@]}
            do
                echo "Removing: $FOLDER from $REPO_NAME"
                rm -r DIF-SO-data-governance/$ENVIRONMENT/data_ingestion_framework/$FOLDER
            done
    fi
    echo ""
    echo "Copying the files to the container..."
    ./azcopy cp "$REPO_NAME/$ENVIRONMENT/*" "https://$STORAGE_ACCOUNT_NAME.blob.core.windows.net/$CONTAINER_NAME" --recursive=true --disable-auto-decoding=true --exclude-path  ".git"

    else echo "Environment $ENVIRONMENT not detected! Skipping..."
            echo "";
    fi
    ((i=i+1))
    ((REPOS_COUNT=REPOS_COUNT-1))


done

迭代输出

首次迭代输出

Getting the repo name to be deployed...
repos_filtered_blob.json
Repository name: DIF-SO-data-governance-test-cases
Checking if the repo should be deployed to CH-SO-BIA-DATAHUB-PL-UK environment...
CH-SO-BIA-DATAHUB-PL-UK environment detected! Extracting the source branch name...
Source branch name: develop

第二次迭代输出

Getting the repo name to be deployed...
ls: cannot access 'repos_filtered_blob.json': No such file or directory
jq: error: Could not open file repos_filtered_blob.json: No such file or directory
Repository name:
Checking if the repo should be deployed to CH-SO-BIA-DATAHUB-PL-UK environment...
CH-SO-BIA-DATAHUB-PL-UK environment detected! Extracting the source branch name...
repos_filtered_blob.json: No such file or directory
Source branch name:
jq: error: Could not open file repos_filtered_blob.json: No such file or directory
Repository LINK:
Adjusted link:
jq: error: Could not open file repos_filtered_blob.json: No such file or directory
jq: error: Could not open file repos_filtered_blob.json: No such file or directory
Container name:
问题原因与解决方案

原因分析

和less命令无关,核心问题是工作目录切换未复位:

  • 脚本执行cd $REPO_NAME进入克隆的仓库目录
  • if分支(仓库有最近提交)会执行cd ..回到原目录,但else分支(无最近提交)没有该操作
  • 若第一次迭代走到else分支,当前目录会停留在仓库目录下,第二次迭代时就找不到位于原目录的repos_filtered_blob.json

修复方案

方式1:用pushd/popd管理目录

将cd $REPO_NAME替换为pushd $REPO_NAME,循环结束前执行popd确保回到原目录:

echo "Checking if the repository had recent commits..."
pushd $REPO_NAME

if git log --date=relative --since "2 months ago" | grep -q commit; 
then
    # 原if分支代码不变
else 
    echo "Environment $ENVIRONMENT not detected! Skipping..."
    echo "";
fi
popd # 强制回到原目录

方式2:在else分支补充cd ..

确保无论分支走向,都回到原目录:

else 
    echo "Environment $ENVIRONMENT not detected! Skipping..."
    echo "";
    cd .. # 补充此行
fi

方式3:使用文件绝对路径

提前定义文件绝对路径,避免目录切换影响:

# 脚本开头添加
JSON_FILE=$(realpath repos_filtered_blob.json)

# 后续所有jq调用替换为绝对路径
REPO_NAME=$( jq -r .[$i].Name "$JSON_FILE")
BRANCH_NAME=$(jq -r '.['$i'].BRANCH' "$JSON_FILE") # 同时去掉多余的less,直接让jq读文件更高效
# 其他jq调用同理替换

额外优化:less repos_filtered_blob.json | jq ...完全没必要,jq可直接读取文件,这样写会引入冗余进程,建议直接改为jq -r '.['$i'].BRANCH' repos_filtered_blob.json(或绝对路径)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 09:01:30