You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Bash程序中嵌套目录的深度限制及路径引用错误求助

Bash程序中嵌套目录的深度限制及路径引用错误求助

嗨,我完全懂你现在的困扰——刚接触Bash写脚本,本来想着把功能拆分到不同库文件里方便维护,结果卡在路径引用上,还误以为是目录嵌套太深导致的,这种摸不着头绪的感觉真的很闹心😅

先给你吃颗定心丸:Bash根本没有目录嵌套深度的限制,你遇到的No such file or directory错误和目录层数完全无关,核心问题是相对路径的基准搞错了

问题根源解释

当你在根目录的main.sh里执行source "./distro_Installers/<distro-name>_Installer.sh"时,这个_Installer.sh脚本是在main.sh的运行工作目录(也就是LINUX_DOT-NET_INSTALLER根目录)下执行的,而不是在distro_Installers文件夹里。

这时候你在_Installer.sh里写的../function_Libraries/sdk_Library,相当于从根目录往上走一级再找目标文件——这显然不存在,自然就报错了。

解决方法(推荐第一种)

方法1:让脚本获取自身的绝对目录(最稳妥)

在每个_Installer.sh的开头添加这段代码,先拿到脚本所在的绝对路径,再基于这个路径引用上层的库文件:

# 获取当前脚本所在的绝对目录,不管脚本在哪里运行都能正确定位
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd)

# 基于脚本所在目录,向上一级引用function_Libraries里的文件
source "$SCRIPT_DIR/../function_Libraries/sdk_Library"
source "$SCRIPT_DIR/../function_Libraries/runtime_Library"

解释一下:${BASH_SOURCE[0]}会返回当前脚本的完整路径,dirname提取出它所在的目录,再通过cd+pwd转换成绝对路径,这样无论你从哪个目录运行main.sh,路径引用都是准确的。

方法2:在main.sh里传递根目录路径

先在main.sh里获取项目根目录的绝对路径,然后在source_Installer.sh时把这个路径传进去:

# 获取main.sh所在的项目根目录
ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd)

# source脚本时传递根目录作为参数
source "./distro_Installers/<distro-name>_Installer.sh" "$ROOT_DIR"

然后在_Installer.sh里用第一个参数来引用库文件:

# 接收main.sh传递过来的根目录
ROOT_DIR="$1"

# 直接用根目录引用库文件
source "$ROOT_DIR/function_Libraries/sdk_Library"

方法3:临时切换工作目录(不推荐)

main.sh里先切换到distro_Installers目录再source脚本,但这种方法可能会影响脚本里其他路径的引用,除非所有路径都基于这个目录设计,否则容易踩坑:

cd distro_Installers
source "./<distro-name>_Installer.sh"
# 记得切回原目录,避免影响后续操作
cd ..

额外建议

你把SDK和Runtime的功能拆分到不同库文件的做法非常棒,这样代码结构清晰、便于维护,完全不用怀疑这个设计的合理性。只要解决了路径引用的问题,你的目录嵌套结构不管多深都能正常工作。

备注:内容来源于stack exchange,提问作者sonAndrew

火山引擎 最新活动