如何编写兼容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
相关产品推荐
相关产品推荐

