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

如何在被source的Bash脚本中获取发起source的脚本目录

获取发起source操作的脚本所在目录

直接修改included_by_other_shell_script.sh中的get_bash_script_dir函数即可实现需求:

get_bash_script_dir() {
    # 获取发起source调用的脚本路径
    local caller_script="${BASH_SOURCE[1]}"
    # 转换为绝对路径的目录
    local script_dir=$(cd "$(dirname "$caller_script")" && pwd)
    echo "$script_dir"
}

原理说明

bash提供了BASH_SOURCE这个特殊数组,用来追踪脚本的调用栈:

  • ${BASH_SOURCE[0]}指向当前正在执行的脚本(也就是被source的通用脚本)
  • ${BASH_SOURCE[1]}指向发起这次source操作的脚本(即/tmp/main/sourcing_test.sh)

通过dirname提取脚本的目录部分后,再用cd ... && pwd确保得到的是绝对路径,避免相对路径导致的错误。

兼容直接执行的扩展

如果需要让这个函数同时兼容「被source调用」和「直接执行脚本」两种场景,可以添加 fallback 逻辑:

get_bash_script_dir() {
    # 优先取发起source的脚本,没有则用当前执行的脚本($0)
    local caller_script="${BASH_SOURCE[1]:-$0}"
    local script_dir=$(cd "$(dirname "$caller_script")" && pwd)
    echo "$script_dir"
}

验证示例

假设/tmp/main/sourcing_test.sh内容如下:

source /tmp/sourced/included_by_other_shell_script.sh
test_dir=$(get_bash_script_dir)
echo "$test_dir"

执行该脚本后,会输出/tmp/main,完全符合预期。

内容的提问来源于stack exchange,提问作者stackbiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:28:11