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

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


当前回答

我倾向于将.bashrc和.bash_alias保存在所有平台都可以访问的文件共享中。这就是我如何在我的.bash_alias中克服这个问题:

if [[ -f (name of share)/.bash_alias_$(uname) ]]; then
    . (name of share)/.bash_alias_$(uname)
fi

我有一个。bash_alias_linux的例子:

alias ls='ls --color=auto'

通过这种方式,我将特定于平台的代码和可移植的代码分开,你可以对.bashrc做同样的事情

其他回答

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

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

顺便说一句:$OSTYPE在这里也被设置为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};

在bash中,使用$OSTYPE和$HOSTTYPE,如文档所示;这就是我的工作。如果这还不够,如果甚至uname或uname -a(或其他适当的选项)都没有提供足够的信息,那么总是有配置。猜测脚本来自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用于其他用途,它对我来说工作得很好。

我在几个Linux发行版上尝试了上述消息,发现下面的消息最适合我。这是一个简短、简洁的答案,也适用于Windows上的Bash。

OS=$(cat /etc/*release | grep ^NAME | tr -d 'NAME="') #$ echo $OS # Ubuntu