我想保持我的.bashrc和.bash_login文件在版本控制,以便我可以在我使用的所有计算机之间使用它们。问题是我有一些操作系统特定的别名,所以我正在寻找一种方法来确定脚本是否在Mac OS X, Linux或Cygwin上运行。
在Bash脚本中检测操作系统的正确方法是什么?
我想保持我的.bashrc和.bash_login文件在版本控制,以便我可以在我使用的所有计算机之间使用它们。问题是我有一些操作系统特定的别名,所以我正在寻找一种方法来确定脚本是否在Mac OS X, Linux或Cygwin上运行。
在Bash脚本中检测操作系统的正确方法是什么?
当前回答
OSTYPE美元
你可以简单地使用预定义的$OSTYPE变量,例如:
case "$OSTYPE" in
solaris*) echo "SOLARIS" ;;
darwin*) echo "OSX" ;;
linux*) echo "LINUX" ;;
bsd*) echo "BSD" ;;
msys*) echo "WINDOWS" ;;
cygwin*) echo "ALSO WINDOWS" ;;
*) echo "unknown: $OSTYPE" ;;
esac
但是,旧的shell(如Bourne shell)不能识别它。
生命
另一种方法是基于uname命令检测平台。
请参阅以下脚本(已准备好包含在.bashrc中):
# Detect the platform (similar to $OSTYPE)
OS="`uname`"
case $OS in
'Linux')
OS='Linux'
alias ls='ls --color=auto'
;;
'FreeBSD')
OS='FreeBSD'
alias ls='ls -G'
;;
'WindowsNT')
OS='Windows'
;;
'Darwin')
OS='Mac'
;;
'SunOS')
OS='Solaris'
;;
'AIX') ;;
*) ;;
esac
你可以在我的.bashrc中找到一些实际的例子。
以下是在Travis CI上使用的类似版本:
case $(uname | tr '[:upper:]' '[:lower:]') in
linux*)
export TRAVIS_OS_NAME=linux
;;
darwin*)
export TRAVIS_OS_NAME=osx
;;
msys*)
export TRAVIS_OS_NAME=windows
;;
*)
export TRAVIS_OS_NAME=notset
;;
esac
其他回答
bash manpage说变量OSTYPE存储了操作系统的名称:
OSTYPE自动设置为描述bash正在执行的操作系统的字符串。默认为system- 相关的。
它在这里被设置为linux-gnu。
OSTYPE美元
你可以简单地使用预定义的$OSTYPE变量,例如:
case "$OSTYPE" in
solaris*) echo "SOLARIS" ;;
darwin*) echo "OSX" ;;
linux*) echo "LINUX" ;;
bsd*) echo "BSD" ;;
msys*) echo "WINDOWS" ;;
cygwin*) echo "ALSO WINDOWS" ;;
*) echo "unknown: $OSTYPE" ;;
esac
但是,旧的shell(如Bourne shell)不能识别它。
生命
另一种方法是基于uname命令检测平台。
请参阅以下脚本(已准备好包含在.bashrc中):
# Detect the platform (similar to $OSTYPE)
OS="`uname`"
case $OS in
'Linux')
OS='Linux'
alias ls='ls --color=auto'
;;
'FreeBSD')
OS='FreeBSD'
alias ls='ls -G'
;;
'WindowsNT')
OS='Windows'
;;
'Darwin')
OS='Mac'
;;
'SunOS')
OS='Solaris'
;;
'AIX') ;;
*) ;;
esac
你可以在我的.bashrc中找到一些实际的例子。
以下是在Travis CI上使用的类似版本:
case $(uname | tr '[:upper:]' '[:lower:]') in
linux*)
export TRAVIS_OS_NAME=linux
;;
darwin*)
export TRAVIS_OS_NAME=osx
;;
msys*)
export TRAVIS_OS_NAME=windows
;;
*)
export TRAVIS_OS_NAME=notset
;;
esac
我在几个Linux发行版上尝试了上述消息,发现下面的消息最适合我。这是一个简短、简洁的答案,也适用于Windows上的Bash。
OS=$(cat /etc/*release | grep ^NAME | tr -d 'NAME="') #$ echo $OS # Ubuntu
这将检查一堆已知文件,以确定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"
尝试使用“uname”。例如,在Linux中:"uname -a"。
根据手册页面,uname符合SVr4和POSIX,所以它应该也适用于Mac OS X和Cygwin,但我不能确认。
顺便说一句:$OSTYPE在这里也被设置为linux-gnu:)