我想将.bashrc
和.bash_login
文件保存在版本控制中,以便我可以在我使用的所有计算机之间使用它们。 问题是我有一些操作系统特定的别名,所以我一直在寻找一种方法来确定脚本是否在Mac OS X,Linux或Cygwin上运行 。
在Bash脚本中检测操作系统的正确方法是什么?
#1楼
我建议避免一些这些答案。 不要忘记您可以选择其他形式的字符串比较,这将清除大多数变体或提供的丑陋代码。
一个这样的解决方案是简单的检查,例如:
if [[ "$OSTYPE" =~ ^darwin ]]; then
除了版本后缀之外,它还具有匹配任何版本的Darwin的额外好处。 这也适用于人们可能期望的Linux
任何变体。
你可以看到我的点文件中的一些附加的例子在这里
#2楼
执行以下操作有助于为ubuntu正确执行检查:
if [[ "$OSTYPE" =~ ^linux ]]; then
sudo apt-get install <some-package>
fi
#3楼
$OSTYPE
您可以简单地使用预定义的$OSTYPE
变量,例如:
case "$OSTYPE" in
solaris*) echo "SOLARIS" ;;
darwin*) echo "OSX" ;;
linux*) echo "LINUX" ;;
bsd*) echo "BSD" ;;
msys*) echo "WINDOWS" ;;
*) echo "unknown: $OSTYPE" ;;
esac
但是旧版的shell (例如Bourne shell ) 无法识别它。
uname
另一种方法是基于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
以下是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
#4楼
这应该可以安全地用于所有发行版。
$ 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
#5楼
我倾向