我有一个shell脚本,在Windows/Cygwin和Mac和Linux上都使用。每个版本都需要稍微不同的变量。
shell/bash脚本如何检测它是在Cygwin、Mac还是Linux上运行?
我有一个shell脚本,在Windows/Cygwin和Mac和Linux上都使用。每个版本都需要稍微不同的变量。
shell/bash脚本如何检测它是在Cygwin、Mac还是Linux上运行?
当前回答
好的,这是我的方法。
osis()
{
local n=0
if [[ "$1" = "-n" ]]; then n=1;shift; fi
# echo $OS|grep $1 -i >/dev/null
uname -s |grep -i "$1" >/dev/null
return $(( $n ^ $? ))
}
e.g.
osis Darwin &&
{
log_debug Detect mac osx
}
osis Linux &&
{
log_debug Detect linux
}
osis -n Cygwin &&
{
log_debug Not Cygwin
}
我在我的dotfiles中使用这个
其他回答
# This script fragment emits Cygwin rulez under bash/cygwin
if [[ $(uname -s) == CYGWIN* ]];then
echo Cygwin rulez
else
echo Unix is king
fi
如果uname -s命令的前6个字符为“CYGWIN”,则假设系统为CYGWIN
根据Albert的回答,我喜欢使用$COMSPEC来检测Windows:
#!/bin/bash
if [ "$(uname)" == "Darwin" ]
then
echo Do something under Mac OS X platform
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]
then
echo Do something under Linux platform
elif [ -n "$COMSPEC" -a -x "$COMSPEC" ]
then
echo $0: this script does not support Windows \:\(
fi
这避免了为$OS解析Windows名称的变体,也避免了解析uname的变体,如MINGW、Cygwin等。
背景:%COMSPEC%是一个Windows环境变量,指定命令处理器(即Windows shell)的完整路径。这个变量的值通常是%SystemRoot%\system32\cmd.exe,它通常计算为C:\Windows\system32\cmd.exe。
http://en.wikipedia.org/wiki/Uname
所有你需要的信息。谷歌是你的朋友。
使用uname -s命令查询系统名称。
麦克:达尔文 Cygwin: CYGWIN_… Linux:多种多样,Linux为大多数
好的,这是我的方法。
osis()
{
local n=0
if [[ "$1" = "-n" ]]; then n=1;shift; fi
# echo $OS|grep $1 -i >/dev/null
uname -s |grep -i "$1" >/dev/null
return $(( $n ^ $? ))
}
e.g.
osis Darwin &&
{
log_debug Detect mac osx
}
osis Linux &&
{
log_debug Detect linux
}
osis -n Cygwin &&
{
log_debug Not Cygwin
}
我在我的dotfiles中使用这个
当提出这个问题时,Linux的Windows子系统还不存在。它在我的测试中给出了以下结果:
uname -s -> Linux
uname -o -> GNU/Linux
uname -r -> 4.4.0-17763-Microsoft
这意味着您需要使用uname -r来将其与本地Linux区分开来。