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

