Solaris 8环境下,被source的脚本如何获取自身所在目录?
在Solaris 8的Bash 2.02中获取source脚本的自身路径
你的需求可以实现,但因为使用的是非常老旧的Bash 2.02版本,那些基于Bash 3.0+特性的方案(比如${BASH_SOURCE[0]})无法生效,需要用适配老版本的方法。
为什么之前的方案失效
pwd/$PWD:仅返回当前工作目录,和脚本实际位置无关。$0:source是Shell内置命令,此时$0指向的是当前Shell进程(比如-bash),而非脚本路径。${BASH_SOURCE[0]}:这是Bash 3.0才引入的特性,你的2.02版本不支持,因此输出为空。
可行解决方案:利用历史命令提取路径
Bash 2.02支持历史记录功能,source脚本的命令会被记录到历史中,我们可以通过解析这条历史命令来获取脚本路径:
修改你的source-me/source-me脚本为:
# 获取最近1条历史命令,去掉行首的编号 LAST_CMD=$(history 1 | awk '{sub(/^[0-9]+ /, ""); print}') # 提取source命令后的脚本路径(第二个字段) SCRIPT_PATH=$(echo "$LAST_CMD" | awk '{print $2}') # 将相对路径转换为绝对路径 SCRIPT_ABS_DIR=$(cd "$(dirname "$SCRIPT_PATH")" && pwd) SCRIPT_ABS_PATH="$SCRIPT_ABS_DIR/$(basename "$SCRIPT_PATH")" echo "脚本所在目录(绝对路径):$SCRIPT_ABS_DIR" echo "脚本完整路径(绝对路径):$SCRIPT_ABS_PATH"
执行测试:
$ . source-me/source-me 脚本所在目录(绝对路径):/home/username/source-me 脚本完整路径(绝对路径):/home/username/source-me/source-me
注意事项
- 确保Shell的历史记录功能未被禁用(默认是开启的,若执行过
set +o history则无法生效)。 - 该方法仅适用于交互式Shell中直接source脚本的场景,若通过嵌套脚本source,可能会提取到错误的历史命令。
内容的提问来源于stack exchange,提问作者Johannes
相关产品推荐
相关产品推荐

