Bash脚本文件存在检测异常:文件实际存在却提示不存在
问题排查与解决方案
1. 先验证核心变量的正确性
最可能的问题是SCRIPT_DIR变量未正确传递或取值错误,导致拼接出的文件路径不对。在common.sh开头添加调试输出,先确认变量值:
# common.sh开头插入调试代码 echo "DEBUG: 当前SCRIPT_DIR值为: ${SCRIPT_DIR}" echo "DEBUG: 环境中BACKUP_VARS_FILE值为: ${BACKUP_VARS_FILE:-未设置}"
执行脚本后,检查输出的路径是否与common.sh所在目录一致,以及是否有意外设置的环境变量覆盖了默认路径。
2. 直接验证目标文件的实际路径
在BACKUP_VARS_FILE赋值后,添加文件检查命令,手动确认路径是否正确:
BACKUP_VARS_FILE=${BACKUP_VARS_FILE:-"${SCRIPT_DIR}"/bitbucket.diy-backup.vars.sh} # 插入路径验证 echo "DEBUG: 尝试查找的文件路径: ${BACKUP_VARS_FILE}" ls -l "${BACKUP_VARS_FILE}" 2>&1
如果输出显示"没有那个文件或目录",说明路径拼接错误,大概率是SCRIPT_DIR取值不正确。
3. 改用独立路径计算(最可靠的修复方案)
不要依赖主脚本传递的SCRIPT_DIR,让common.sh自己计算所在目录,避免嵌套source时的变量传递问题:
# 替换common.sh中的路径计算部分 COMMON_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) BACKUP_VARS_FILE=${BACKUP_VARS_FILE:-"${COMMON_DIR}"/bitbucket.diy-backup.vars.sh}
这样不管主脚本以何种方式调用common.sh,都能精准定位到同目录下的目标文件。
4. 排查分支执行情况
如果怀疑脚本未进入if/else分支,在分支内添加明确标记:
if [ -f "${BACKUP_VARS_FILE}" ]; then echo "DEBUG: 进入if分支 - 文件存在" source "${BACKUP_VARS_FILE}" echo "Using vars file: '${BACKUP_VARS_FILE}'" else echo "DEBUG: 进入else分支 - 文件未找到" error "'${BACKUP_VARS_FILE}' not found" bail "You should create it using '${COMMON_DIR}/bitbucket.diy-backup.vars.sh.example' as a template" fi
通过输出确认分支是否正常执行,排除error/bail函数导致的视觉混淆。
5. 额外检查项
- 确认目标文件名无拼写错误(比如大小写、多余/缺失字符)
- 检查文件权限:运行脚本的用户是否拥有该文件的读权限(执行
ls -ld "${BACKUP_VARS_FILE}"验证)
内容的提问来源于stack exchange,提问作者Teh__docco
相关产品推荐
相关产品推荐

