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

如何编写兼容Windows与类Unix系统的Shell脚本获取自身执行目录?

跨Windows(Git sh.exe)与类Unix系统获取脚本所在目录的解决方案

原脚本在Windows环境下失效的核心原因是:Git附带的sh.exe接收的Windows路径(比如C:\Program Files\Some Program\whatsmydirectory.sh)是带盘符的格式,原脚本直接拼接/后会生成混乱的路径格式,导致后续解析错误。

以下是修改后的兼容脚本:

#!/bin/sh

# 处理$0的路径格式,兼容Windows和类Unix系统
script_path="$0"
# 判断是否为Windows路径(包含:\)
if echo "$script_path" | grep -qE '^[A-Za-z]:'; then
    # 把Windows盘符转换成Git sh的Unix风格(C:\ → /c/),反斜杠转正斜杠
    script_path="/$(echo "$script_path" | sed -E 's/^([A-Za-z]):/\L\1/; s/\\/\//g')"
fi

a="$script_path"
# 截取脚本所在目录路径
a="${a%/*}"
# 如果截取后为空(比如脚本在当前目录执行),设为当前目录
a="${a:-.}"
# 进入目录并获取绝对路径
BINDIR=$(cd "$a" && pwd)

echo "$BINDIR"

关键修改说明

  • Windows路径转换:通过grep判断路径是否带盘符,用sed把C:\xxx转换成/c/xxx,同时将所有反斜杠替换为正斜杠,让sh.exe能正确识别路径。
  • 简化冗余步骤:去掉原脚本中不必要的路径拼接和输出,保留核心的目录截取与绝对路径获取逻辑。

测试验证

  • 类Unix系统(MacOS):执行./whatsmydirectory.sh,输出/Users/username/Desktop(正确)。
  • Windows环境:执行C:/Program Files/Git/usr/bin/sh.exe "C:\Program Files\Some Program\whatsmydirectory.sh",输出/c/Program Files/Some Program(对应Windows路径C:\Program Files\Some Program,符合Git sh的路径格式)。

内容的提问来源于stack exchange,提问作者price-visible-announcement

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 11:22:30