我想保持我的.bashrc和.bash_login文件在版本控制,以便我可以在我使用的所有计算机之间使用它们。问题是我有一些操作系统特定的别名,所以我正在寻找一种方法来确定脚本是否在Mac OS X, Linux或Cygwin上运行。
在Bash脚本中检测操作系统的正确方法是什么?
我想保持我的.bashrc和.bash_login文件在版本控制,以便我可以在我使用的所有计算机之间使用它们。问题是我有一些操作系统特定的别名,所以我正在寻找一种方法来确定脚本是否在Mac OS X, Linux或Cygwin上运行。
在Bash脚本中检测操作系统的正确方法是什么?
当前回答
uname
or
uname -a
如果你想了解更多信息
其他回答
试试这个:
DISTRO=$(cat /etc/*-release | grep -w NAME | cut -d= -f2 | tr -d '"')
echo "Determined platform: $DISTRO"
检测操作系统和CPU类型并不容易移植。我有一个大约100行的sh脚本,可以在非常广泛的Unix平台上运行:自1988年以来我使用过的任何系统。
关键要素是
uname -p是处理器类型,但在现代Unix平台上通常是未知的。 uname -m将在某些Unix系统上给出“机器硬件名称”。 /bin/arch,如果存在,通常会给出处理器的类型。 不带参数的Uname将命名操作系统。
最终,你将不得不考虑平台之间的区别,以及你想把它们做得多好。例如,为了简单起见,我将i386到i686,任何“奔腾*”和任何“AMD*Athlon*”都视为x86。
我的~ /。profile在启动时运行一个a脚本,该脚本将一个变量设置为一个字符串,表示CPU和操作系统的组合。我有特定于平台的bin, man, lib,并包括基于此设置的目录。然后我设置了大量的环境变量。例如,重新格式化邮件的shell脚本可以调用$LIB/mailfmt,这是一个特定于平台的可执行二进制文件。
如果你想抄近路,uname -m和普通的uname会在很多平台上告诉你你想知道什么。当你需要的时候添加其他东西。(和用例,不嵌套if!)
如果有人对检测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};
在所有发行版上使用这应该是安全的。
$ cat /etc/*release
这就产生了这样的东西。
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=17
DISTRIB_CODENAME=qiana
DISTRIB_DESCRIPTION="Linux Mint 17 Qiana"
NAME="Ubuntu"
VERSION="14.04.1 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.1 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
根据需要提取/赋值给变量
注意:在一些设置。这也可能会给您一些可以忽略的错误。
cat: /etc/upstream-release: Is a directory
执行以下操作可以帮助正确执行ubuntu检查:
if [[ "$OSTYPE" =~ ^linux ]]; then
sudo apt-get install <some-package>
fi