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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:06:04