我想保持我的.bashrc和.bash_login文件在版本控制,以便我可以在我使用的所有计算机之间使用它们。问题是我有一些操作系统特定的别名,所以我正在寻找一种方法来确定脚本是否在Mac OS X, Linux或Cygwin上运行。

在Bash脚本中检测操作系统的正确方法是什么?


当前回答

尝试使用“uname”。例如,在Linux中:"uname -a"。

根据手册页面,uname符合SVr4和POSIX,所以它应该也适用于Mac OS X和Cygwin,但我不能确认。

顺便说一句:$OSTYPE在这里也被设置为linux-gnu:)

其他回答

我建议避免回答这些问题。不要忘记,您可以选择其他形式的字符串比较,这将清除大多数变体或丑陋的代码。

其中一个解决方案是简单的检查,例如:

if [[ "$OSTYPE" =~ ^darwin ]]; then

它还有一个额外的好处,就是可以匹配任何版本的达尔文,尽管它有版本后缀。这也适用于任何版本的Linux。

你可以在我的dotfiles中看到一些额外的例子

试试这个:

DISTRO=$(cat /etc/*-release | grep -w NAME | cut -d= -f2 | tr -d '"')
echo "Determined platform: $DISTRO"

你可以使用以下方法:

OS=$(uname -s)

然后你可以在你的脚本中使用OS变量。

bash manpage说变量OSTYPE存储了操作系统的名称:

OSTYPE自动设置为描述bash正在执行的操作系统的字符串。默认为system- 相关的。

它在这里被设置为linux-gnu。

如果有人对检测WSL和WSL版本2感兴趣,我也会使用这个工具。

#!/usr/bin/env bash

unameOut=$(uname -a)
case "${unameOut}" in
    *Microsoft*)     OS="WSL";; #must be first since Windows subsystem for linux will have Linux in the name too
    *microsoft*)     OS="WSL2";; #WARNING: My v2 uses ubuntu 20.4 at the moment slightly different name may not always work
    Linux*)     OS="Linux";;
    Darwin*)    OS="Mac";;
    CYGWIN*)    OS="Cygwin";;
    MINGW*)     OS="Windows";;
    *Msys)     OS="Windows";;
    *)          OS="UNKNOWN:${unameOut}"
esac

echo ${OS};