当前位置: 首页 > news >正文

怎么在 Shell 脚本中获取当前脚本所在绝对路径?

在 Shell 脚本中获取脚本自身的绝对路径,最稳妥的方式是结合 dirname 和 pwd 命令处理 $0 变量,而不是直接使用 pwd。

先说结论:通过切换目录再获取工作路径的方法兼容性最好,但需注意脚本被 source 调用时的特殊情况。

  • 适合:大多数 Bash 和 POSIX Sh 环境
  • 先看:脚本是通过执行还是 source 调用
  • 建议:涉及符号链接时额外处理 readlink

命令速用版

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
echo "$SCRIPT_DIR"

为什么会这样

很多初学者会直接使用 pwd 命令,但 pwd 获取的是当前 Shell 的工作目录,而不是脚本文件所在的目录。如果用户在其他目录下执行脚本,pwd 的结果就会错误。变量 $0 虽然代表脚本名,但它可能是相对路径(如 ./script.sh)或仅包含文件名,因此需要先用 dirname 提取目录部分,再 cd 进入该目录并使用 pwd 转为绝对路径。

分步处理

1. 获取脚本所在目录的相对路径:

dir="$(dirname "$0")"

2. 进入该目录并获取绝对路径:

abs_path="$(cd "$dir" && pwd)"

3. 合并为一行赋值给变量,方便后续使用:

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"

注意:如果脚本需要跟随符号链接(symlink)找到真实物理路径,需配合 readlink 命令,但 readlink 在不同系统上参数行为不一致,需谨慎使用。

怎么验证是否生效

在脚本末尾添加 echo 命令输出路径变量,并在不同目录下调用脚本进行测试:

echo "脚本绝对路径:$SCRIPT_DIR"

测试方法:

  • 在脚本所在目录执行:./script.sh
  • 在上级目录执行:/path/to/script.sh
  • 使用绝对路径执行:/absolute/path/to/script.sh

观察输出是否始终指向脚本文件所在的文件夹,而不是你当前所在的文件夹。

常见坑

1. Source 调用问题:如果脚本是通过 source 或 . 命令加载的,$0 代表的是当前 Shell 而不是脚本文件。在 Bash 中建议使用 ${BASH_SOURCE[0]} 替代 $0 来处理这种情况。

2. 符号链接:如果脚本本身是一个软链接,上述方法获取的是链接文件所在的路径,而不是真实文件路径。如需真实路径,需结合 readlink -f(Linux)或 realpath 命令,但要注意 macOS 默认不支持 readlink -f。

3. 权限问题:cd 命令需要执行权限,如果脚本所在目录不可进入,该方法会失败。建议在生产环境中增加错误判断,如 cd ... || exit 1。

参考来源

  • GNU Bash Manual, Special Parameters, https://www.gnu.org/software/bash/manual/
  • POSIX.1-2017 Standard, dirname utility, https://pubs.opengroup.org/onlinepubs/9699919799/utilities/dirname.html

原文链接:https://www.zjcp.cc/ask/10965.html

http://www.jsqmd.com/news/806356/

相关文章:

  • SpaceXAI组建进行时,马斯克已提交商标注册申请
  • 开源AI智能体可视化控制台:架构、部署与性能优化指南
  • 5 款实用漏洞扫描工具,网安从业者必备收藏
  • Epsilla向量数据库:并行图遍历算法与生产级RAG应用实战
  • ARM PMU寄存器解析:PMVIDSR与PMZR_EL0实战应用
  • 容器镜像安全剖析:从元数据探查到自定义构建的完整指南
  • 2026年知名的除铁器机械/输送机械生产厂家推荐 - 品牌宣传支持者
  • AI编程助手集成DRPC技能包:无缝查询区块链数据的实践指南
  • 别再只会调用delay了!深入STM32 Systick定时器,从寄存器配置到实现精准us/ms延时的底层原理
  • 为什么93%的DeepSeek PR被拒?揭秘CI流水线自动拦截的4类“伪Clean”代码陷阱
  • 量子-经典混合算法优化多体动力学模拟
  • 2026年比较好的混合机设备/搅拌设备用户口碑推荐厂家 - 品牌宣传支持者
  • 探索awk:从文本处理到编程的多功能工具全面解析
  • 【目标检测系统】基于YOLOv8的鸟类检测系统
  • Java程序员必看:掌握大模型,收藏提升职场竞争力!
  • Claude Code / Cursor 写的代码,你敢直接上线吗?我踩过一次坑,再也不敢
  • Android平台光学传感器集成实战与优化
  • 构筑数字韧性:从零信任到内生安全,打造面向未来的数字基础设施
  • Unity烘焙光影图总出脏斑?别急着重做模型,先检查这个‘Generate Lightmap UVs’开关
  • 2026年5月,泉州家庭财富规划与传承,为何应关注资深婚姻继承律师? - 2026年企业推荐榜
  • Narrative-craft:结构化内容生成框架,提升技术文档与知识库管理效率
  • OpenClaw Dashboard V2:物联网与创客项目的现代化Web仪表盘实战
  • 终极解决Reloaded-II模组无限下载循环:5步诊断与完整修复指南
  • macOS Unlocker V3.0:在Windows/Linux电脑上运行macOS虚拟机的终极指南
  • 无人机语言引导物体放置技术解析与应用
  • 别急着给M5掏钱!20周年 MacBook Pro “全能王”曝光
  • 高效AI沟通指南:从提示工程到Awesome Prompts仓库实战
  • AGiXT智能体框架:构建自主规划与执行复杂任务的AI系统
  • AI学习模式实战:从提示词工程到知识管理,打造高效学习工作流
  • 构建个人技能仓库:用Git+Markdown打造可复用的技术知识库