我想保持我的.bashrc和.bash_login文件在版本控制,以便我可以在我使用的所有计算机之间使用它们。问题是我有一些操作系统特定的别名,所以我正在寻找一种方法来确定脚本是否在Mac OS X, Linux或Cygwin上运行。
在Bash脚本中检测操作系统的正确方法是什么?
我想保持我的.bashrc和.bash_login文件在版本控制,以便我可以在我使用的所有计算机之间使用它们。问题是我有一些操作系统特定的别名,所以我正在寻找一种方法来确定脚本是否在Mac OS X, Linux或Cygwin上运行。
在Bash脚本中检测操作系统的正确方法是什么?
当前回答
对于我的.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。
其他回答
如果有人对检测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 manpage说变量OSTYPE存储了操作系统的名称:
OSTYPE自动设置为描述bash正在执行的操作系统的字符串。默认为system- 相关的。
它在这里被设置为linux-gnu。
在bash中,使用$OSTYPE和$HOSTTYPE,如文档所示;这就是我的工作。如果这还不够,如果甚至uname或uname -a(或其他适当的选项)都没有提供足够的信息,那么总是有配置。猜测脚本来自GNU项目,正是为了这个目的。
试试这个:
DISTRO=$(cat /etc/*-release | grep -w NAME | cut -d= -f2 | tr -d '"')
echo "Determined platform: $DISTRO"
你可以使用以下方法:
OS=$(uname -s)
然后你可以在你的脚本中使用OS变量。