1. Bash脚本判断操作系统

Bash脚本大揭秘:一键识别macOS、Windows还是Linux,让你的跨平台部署更轻松!

微信公众号「雪之梦技术驿站」

致读者: 点击上方 “雪之梦技术驿站” → 点击右上角“ ... ”→ 点选“设为星标 ★ ” 加上星标,就不会找不到我啦!

1.1. 引言

由于工作原因需要在macwindos电脑之间随时切换,为了方便会写一些脚本解放重复性劳动.

类似于这样的上传文件命令就有很强的操作系统路径强相关性,需要区分到底是mac还是windows,从而决定不同的上传路径.

# mac
scp -r /Users/snowdreams1006/generator/* ali:~/generator

# windows
scp -r /g/generator/* ali:~/generator

因此,研究一下在bash环境中判断识别不同的操作系统,在这里分享一下.

1.2. 思路

1.2.1. 1. 检查 uname 命令

第一反应就是使用uname命令观察在不同操作系统的输出,下面测试了三款操作系统.

uname -s
# Linux

uname -s
# Darwin

uname -s
# MINGW64_NT-10.0-19045

如果是 windows10 原生终端环境power shell,是不支持uname命令的,会得到如下报错信息.

顺便科普一下uname的命令:

总结: uname命令在Unix-like系统(包括macOS 和Linux`)上可用,但在原生 Windows 命令行中不可用

通过检查 uname 的输出,可以区分 macOS 和其他 Unix-like 系统.

如果是目前的个人需求足矣判断出 mac 即可,其他情况就是 windows,也可以检查 windows 文件或者特殊的环境变量.

1.2.2. 2. 检查 Windows 特有的环境变量

在我的电脑-高级设置-环境变量-系统环境变量中可以看到很多键值对的环境变量,尽可能挑选出系统自带且特殊的名称.

实测下来只有Windows会有这些环境变量的值,其他操作系统输出为空,那么就可以判断特殊的环境变量识别出windows操作系统.

echo $WINDIR
# Linux 输出为空

echo $WINDIR
# Darwin 输出为空

echo $WINDIR
# Windows 输出 C:\Windows

echo $SYSTEMROOT
# Windows 输出 C:\Windows

除此之外还可以检查特定文件的存在性(比如macOS上的 /System/Library/CoreServices/SystemVersion.plistWindows上的C:\Windows\System32\cmd.exe等等.

1.3. 实现

思路: 使用 uname -s 根据输出内容判断macOS还是Linux,然后再获取特定的环境变量的值来区分是否是Windows操作系统.

实现: 脚本如下,亲测有效.

if [ "$(uname -s)" == "Darwin" ]; then
    echo "This is macOS."
elif [ "$(uname -s)" == "Linux" ]; then
    echo "This is Linux."
elif [ -n "$WINDIR" ] || [ -n "$SYSTEMROOT" ]; then
    echo "This is Windows."
else
    echo "Unknown Unix-like system."
fi

1.4. 总结

值得注意的是Bash本质上是为Unix-like系统设计的,因此在原生 Windows 环境中直接区分操作系统可能需要一些额外的考虑,特别是如果你不是在使用WSL

最后提供本人亲测好用的检测代码,可以简单识别出操作系统从而做出不同决策.

1.5. 往期精彩文章

1.6. 欢迎扫码关注

微信公众号「雪之梦技术驿站」

欢迎扫码关注,私信回复『加群』一起交流技术

最后更新时间: 2024-10-11 11:09:17
作者: 雪之梦技术驿站
来源: 雪之梦技术驿站
本文原创发布于「雪之梦技术驿站」,转载请注明出处,谢谢合作!

/snowdreams1006-wechat-open.png

results matching ""

    No results matching ""