我想保持我的.bashrc和.bash_login文件在版本控制,以便我可以在我使用的所有计算机之间使用它们。问题是我有一些操作系统特定的别名,所以我正在寻找一种方法来确定脚本是否在Mac OS X, Linux或Cygwin上运行。
在Bash脚本中检测操作系统的正确方法是什么?
我想保持我的.bashrc和.bash_login文件在版本控制,以便我可以在我使用的所有计算机之间使用它们。问题是我有一些操作系统特定的别名,所以我正在寻找一种方法来确定脚本是否在Mac OS X, Linux或Cygwin上运行。
在Bash脚本中检测操作系统的正确方法是什么?
当前回答
你可以使用以下方法:
OS=$(uname -s)
然后你可以在你的脚本中使用OS变量。
其他回答
bash manpage说变量OSTYPE存储了操作系统的名称:
OSTYPE自动设置为描述bash正在执行的操作系统的字符串。默认为system- 相关的。
它在这里被设置为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};
我在.bashrc中写了这些糖:
if_os () { [[ $OSTYPE == *$1* ]]; }
if_nix () {
case "$OSTYPE" in
*linux*|*hurd*|*msys*|*cygwin*|*sua*|*interix*) sys="gnu";;
*bsd*|*darwin*) sys="bsd";;
*sunos*|*solaris*|*indiana*|*illumos*|*smartos*) sys="sun";;
esac
[[ "${sys}" == "$1" ]];
}
所以我可以这样做:
if_nix gnu && alias ls='ls --color=auto' && export LS_COLORS="..."
if_nix bsd && export CLICOLORS=on && export LSCOLORS="..."
if_os linux && alias psg="ps -FA | grep" #alternative to pgrep
if_nix bsd && alias psg="ps -alwx | grep -i" #alternative to pgrep
if_os darwin && alias finder="open -R"
尝试使用“uname”。例如,在Linux中:"uname -a"。
根据手册页面,uname符合SVr4和POSIX,所以它应该也适用于Mac OS X和Cygwin,但我不能确认。
顺便说一句:$OSTYPE在这里也被设置为linux-gnu:)
这将检查一堆已知文件,以确定linux发行版是Debian还是ubuntu,然后它默认为$OSTYPE变量。
os='Unknown'
unamestr="${OSTYPE//[0-9.]/}"
os=$( compgen -G "/etc/*release" > /dev/null && cat /etc/*release | grep ^NAME | tr -d 'NAME="' || echo "$unamestr")
echo "$os"