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

Bash遍历指定路径下一级子目录执行脚本仅运行一次如何修复

脚本问题修复方案

问题原因

你的脚本循环提前终止是两个错误共同导致的:

  1. 全局开启了set -e参数,只要任意命令返回非0退出码就会直接终止整个脚本,若第一个执行的recon1.sh返回非0退出码,整个批量脚本会直接停止
  2. 冗余的cd ..逻辑错误:你执行recon1.sh时用了子shell(括号包裹的命令块),子shell的目录切换不会影响父脚本的工作目录,额外执行的cd ..会导致第一次循环结束后父脚本退出通路根目录,后续循环找不到目标蛋白子目录

修复后完整代码

#!/bin/bash
# -*- coding: utf-8 -*-
    
set -e
current_path=$(pwd)

pathway_name=$1
path_to_folder="${HOME}/ProjName/pathways/${pathway_name}"
path_to_software_folder="${HOME}/ProjName/software"

# 提前校验通路目录合法性
if [ ! -d "${path_to_folder}" ]; then
  echo "错误:指定的通路目录 ${path_to_folder} 不存在,请检查输入参数"
  exit 1
fi

echo "----running batch_reconcile1.sh on pathway: $*"

for fol in "${path_to_folder}"/*/; do
  [ -d "${fol}" ] || continue ## 非目录直接跳过
  dirname="$(basename "${fol}")"
  # 子shell执行任务,单任务失败仅打印警告不终止全局循环
  (cd "${fol}" && bash "${path_to_software_folder}/recon1.sh" "${dirname}" ) || echo "警告:处理蛋白目录 ${dirname} 时出现异常,已跳过继续处理后续任务"
done

# 执行完成回到脚本启动时的工作目录
cd "${current_path}"

改动说明

  • 所有变量引用增加双引号,避免路径包含空格、特殊字符时执行报错
  • 移除了错误的cd ..语句,避免父脚本工作目录被意外切换
  • 为recon1.sh的执行逻辑增加了异常捕获,单个蛋白目录处理失败不会终止整个批量任务,兼容全局set -e的错误检查规则
  • 新增通路目录存在性校验,提前拦截参数输入错误的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:45:04