跨目录调用Bash脚本时source的函数报command not found问题咨询
问题根源
- 子shell进程隔离:执行
./script.sh时会启动独立的子shell进程,父shell(master_script.sh的运行环境)中通过source加载的函数、变量默认不会被继承到子进程,是触发command not found报错的核心原因。 - 现有代码存在两处语法错误:
master_script.sh中source master_parameters缺少.sh后缀,实际上没有正确加载配置文件functions.sh中函数定义关键字多写了s,正确写法是function do_task {,或者省略关键字直接写do_task() {
解决方案
方法1:用source执行script.sh(最简便,无需修改子脚本)
将./script.sh改为source script.sh执行,script.sh会在当前shell环境下运行,直接复用已经加载完成的变量和函数,无需在script.sh中重复加载依赖。
修改后的master_script.sh示例:
#!/bin/bash source master_parameters.sh cd "$submodule_path" || exit 1 source parameters.sh source functions.sh source script.sh
方法2:script.sh内部自行加载依赖(适合需要独立运行script.sh的场景)
如果script.sh需要支持单独调用,直接在script.sh开头添加依赖加载逻辑,通过脚本自身路径定位同目录下的文件,避免相对路径受执行时工作目录影响。
修改后的script.sh示例:
#!/bin/bash # 获取脚本自身所在的绝对目录 SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd) # 加载同目录依赖 source "$SCRIPT_DIR/parameters.sh" source "$SCRIPT_DIR/functions.sh" do_task
该方案下script.sh的加载逻辑完全不依赖父脚本,无论在什么工作目录下调用都能正常加载依赖。
方法3:导出函数和变量(不推荐)
如果确实需要用子shell运行script.sh,可以在父shell中手动导出需要的函数和变量:
# master_script.sh中source完依赖后执行导出 export -f do_task export my_foo ./script.sh
该方案需要手动导出所有用到的函数、变量,维护成本高,容易遗漏,不推荐使用。
内容的提问来源于stack exchange,提问作者solarflare
相关产品推荐
相关产品推荐

