脚本引入外部函数文件报“没有那个文件或目录”时,主因是source路径解析错误;应使用$(dirname "$0")定位脚本所在目录,配合相对路径加载,并检查文件存在性、权限、换行符及格式。

脚本引入外部函数文件时报“没有那个文件或目录”,问题通常不在主脚本本身,而在于 source 或 . 命令加载的路径不合法——它失败时也复用同一句错误提示,容易误判为脚本不存在。
确认 source 路径是否被正确解析
Linux 的 source 和 . 命令不会自动在当前目录搜索,它们依赖你给出的路径是否真实存在、是否可读、是否符合 shell 解析规则。
- 使用相对路径时(如
source ./lib.sh),确保你运行主脚本时的 当前工作目录 下真有该文件;pwd+ls -l ./lib.sh是最直接验证方式 - 若主脚本中写的是
source lib.sh(无./),shell 会去$PATH里找,不是当前目录——这几乎总是错的,应改为source ./lib.sh或更稳妥的绝对路径 - 避免在不同目录下直接
bash script.sh执行:此时工作目录是调用点,不是脚本所在目录,source相对路径极易失效
让脚本主动切到自身所在目录再加载
这是最通用、抗干扰的做法。不管从哪启动脚本,都能准确定位同级的函数文件。
- 在主脚本开头加上:
cd "$(dirname "$0")",之后所有source都基于脚本位置 - 更安全的写法(不改变全局工作目录):
source "$(dirname "$0")/lib.sh" - 如果函数文件在子目录,比如
./includes/common.sh,就写成:source "$(dirname "$0")/includes/common.sh"
检查函数文件是否存在、可读、无格式污染
即使路径写对了,也可能因文件状态异常导致加载失败。
- 执行
ls -l "$(dirname "$0")/lib.sh"确认文件存在且权限含r(读) - 用
head -n1 lib.sh | od -c查首行是否有\r(Windows 换行符),若有,用dos2unix lib.sh修复 - 用
file lib.sh看输出是否含text,避免误把二进制或空文件当 shell 脚本加载
调试时加一句诊断输出
临时增强可观测性,快速定位哪一步断了。
- 在
source前加:echo "Loading: $(dirname "$0")/lib.sh" - 加判断逻辑:
[[ -f "$(dirname "$0")/lib.sh" ]] || { echo "ERROR: lib.sh not found"; exit 1; } - 用
set -x开启调试模式,能看到 shell 实际展开的路径和执行过程











