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

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


当前回答

我写了一个个人Bash库和脚本框架,使用GNU shtool来进行相当准确的平台检测。

GNU shtool是一个非常可移植的脚本集,其中包含了'shtool platform'命令。下面是输出:

shtool platform -v -F "%sc (%ac) %st (%at) %sp (%ap)"

在一些不同的机器上:

Mac OS X Leopard: 
    4.4BSD/Mach3.0 (iX86) Apple Darwin 9.6.0 (i386) Apple Mac OS X 10.5.6 (iX86)

Ubuntu Jaunty server:
    LSB (iX86) GNU/Linux 2.9/2.6 (i686) Ubuntu 9.04 (iX86)

Debian Lenny:
    LSB (iX86) GNU/Linux 2.7/2.6 (i686) Debian GNU/Linux 5.0 (iX86)

正如您所看到的,这会产生非常令人满意的结果。GNU shtool有点慢,所以我实际上在脚本调用的系统上的一个文件中存储并更新了平台标识。这是我的框架,所以这对我来说是可行的,但你可能会有所不同。

现在,您必须找到一种方法将shtool打包到脚本中,但这并不难。您还可以总是使用uname输出。

编辑:

我错过了Teddy关于配置的帖子。猜(某种程度上)。这些脚本非常相似,但并不相同。我个人也将shtool用于其他用途,它对我来说工作得很好。

其他回答

我认为以下几点应该有用。不过我对win32不太确定。

if [[ "$OSTYPE" == "linux-gnu"* ]]; then
        # ...
elif [[ "$OSTYPE" == "darwin"* ]]; then
        # Mac OSX
elif [[ "$OSTYPE" == "cygwin" ]]; then
        # POSIX compatibility layer and Linux environment emulation for Windows
elif [[ "$OSTYPE" == "msys" ]]; then
        # Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
elif [[ "$OSTYPE" == "win32" ]]; then
        # I'm not sure this can happen.
elif [[ "$OSTYPE" == "freebsd"* ]]; then
        # ...
else
        # Unknown.
fi

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

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

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

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

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

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

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

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

对于我的.bashrc,我使用以下代码:

platform='unknown'
unamestr=$(uname)
if [[ "$unamestr" == 'Linux' ]]; then
   platform='linux'
elif [[ "$unamestr" == 'FreeBSD' ]]; then
   platform='freebsd'
fi

然后我会做如下的事情:

if [[ $platform == 'linux' ]]; then
   alias ls='ls --color=auto'
elif [[ $platform == 'freebsd' ]]; then
   alias ls='ls -G'
fi

虽然很丑,但很管用。如果你愿意,你可以用case代替if。

我写了一个个人Bash库和脚本框架,使用GNU shtool来进行相当准确的平台检测。

GNU shtool是一个非常可移植的脚本集,其中包含了'shtool platform'命令。下面是输出:

shtool platform -v -F "%sc (%ac) %st (%at) %sp (%ap)"

在一些不同的机器上:

Mac OS X Leopard: 
    4.4BSD/Mach3.0 (iX86) Apple Darwin 9.6.0 (i386) Apple Mac OS X 10.5.6 (iX86)

Ubuntu Jaunty server:
    LSB (iX86) GNU/Linux 2.9/2.6 (i686) Ubuntu 9.04 (iX86)

Debian Lenny:
    LSB (iX86) GNU/Linux 2.7/2.6 (i686) Debian GNU/Linux 5.0 (iX86)

正如您所看到的,这会产生非常令人满意的结果。GNU shtool有点慢,所以我实际上在脚本调用的系统上的一个文件中存储并更新了平台标识。这是我的框架,所以这对我来说是可行的,但你可能会有所不同。

现在,您必须找到一种方法将shtool打包到脚本中,但这并不难。您还可以总是使用uname输出。

编辑:

我错过了Teddy关于配置的帖子。猜(某种程度上)。这些脚本非常相似,但并不相同。我个人也将shtool用于其他用途,它对我来说工作得很好。