You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨目录调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:42:00