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

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


当前回答

执行以下操作可以帮助正确执行ubuntu检查:

if [[ "$OSTYPE" =~ ^linux ]]; then
    sudo apt-get install <some-package>
fi

其他回答

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

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

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

试试这个:

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

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

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

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

我写了一个个人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用于其他用途,它对我来说工作得很好。

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

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

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

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

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