求助:合并主Bash脚本Start.sh与被调用脚本为可执行单脚本失败
问题分析与解决方案
问题根源
你遇到的"No such file or directory"错误,本质是工作目录不匹配导致的:
shar命令会将RA_Test/目录的内容解压到当前执行Easy.sh的目录下,形成一个RA_Test子目录- 你原命令最后追加的
RA_Test/Start.sh是在当前工作目录执行该脚本,但Start.sh内部调用其他脚本时用的是相对路径(比如./sub_script.sh),此时脚本会在当前工作目录(而非RA_Test目录)查找这些子脚本,自然找不到。
修复方案
方案1:调整执行逻辑,进入目录后再运行脚本
修改最后追加的命令,让脚本解压后自动进入RA_Test目录再执行Start.sh。完整命令如下:
shar -M -D -Q -q RA_Test/ | sed '/^exit 0/d' > Easy.sh && echo 'cd RA_Test && ./Start.sh' >> Easy.sh && sh Easy.sh
核心改动是把echo "RA_Test/Start.sh"改成echo 'cd RA_Test && ./Start.sh',确保Start.sh在自身所在目录执行,此时它内部的相对路径调用会正确指向RA_Test下的其他脚本。
方案2:修改Start.sh,让它适配任意工作目录执行
如果希望Start.sh无论从哪个目录执行都能找到依赖脚本,可以在Start.sh开头添加一段代码,获取脚本自身所在的绝对路径,然后用该路径调用其他脚本:
# 在Start.sh开头添加 SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd) # 调用其他脚本时替换为绝对路径 # 比如原调用是./another_script.sh,改成: "$SCRIPT_DIR"/another_script.sh
修改后,即使直接执行RA_Test/Start.sh,脚本也能通过SCRIPT_DIR找到同目录下的依赖文件,无需调整Easy.sh的执行命令。
内容的提问来源于stack exchange,提问作者RACHID OUBELK
相关产品推荐
相关产品推荐

