如何在被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
相关产品推荐
相关产品推荐

