bash - 如何检查是否在Cygwin,Mac或Linux中运行?
我有一个shell脚本,可以在Windows / Cygwin,Mac和Linux上使用。 每个版本需要稍微不同的变量。
shell / bash脚本如何检测它是在Cygwin,Mac或Linux上运行?
10个解决方案
269 votes
这是我用来检测三种不同操作系统类型的bash脚本(GNU / Linux,Mac OS X,Windows NT)
请注意
在您的bash脚本中,使用uname -s而不是elif来防止fi导致的问题链接到不同平台中的不同默认shell,或者会出现意外运算符等错误,这就是我的计算机上发生的事情(Ubuntu 64位12.04)。
除非你安装它,否则Mac OS X 10.6.8(Snow Leopard)没有uname -s程序,所以我只使用elif。
设计
使用uname -s获取系统信息(elif参数)。
使用uname -s和elif处理字符串。
使用uname -s elif fi进行匹配作业。
如果需要,可以添加更多系统支持,只需遵循uname -s规范即可。
履行
#!/usr/bin/env bash
if [ "$(uname)" == "Darwin" ]; then
# Do something under Mac OS X platform
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
# Do something under GNU/Linux platform
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]; then
# Do something under 32 bits Windows NT platform
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then
# Do something under 64 bits Windows NT platform
fi
测试
Linux(Ubuntu 12.04 LTS,内核3.2.0)测试好了。
OS X(10.6.8 Snow Leopard)测试好了。
Windows(Windows 7 64位)测试正常。
我学到的是
检查开盘价和收盘价。
检查是否缺少括号和括号{}
参考
[1] uname - 维基百科
[2] shell脚本语法错误:意外的文件结束
[3]从Bash脚本中检测操作系统
[4] BASH编程介绍如何操作
Albert answered 2019-02-25T20:24:17Z
202 votes
通常,/c/cygwin/bin/uname及其各种选项将告诉您正在运行的环境:
pax> uname -a
CYGWIN_NT-5.1 IBM-L3F3936 1.5.25(0.156/4/2) 2008-06-12 19:34 i686 Cygwin
pax> uname -s
CYGWIN_NT-5.1
并且,根据非常有用的/c/cygwin/bin/uname(在评论中),bash为OSX提供了cmd,为Linux提供了Linux,而我的Cygwin给出了CYGWIN_NT-5.1.但是您可能需要尝试各种不同的版本。
所以/c/cygwin/bin/uname代码做这样的检查将是这样的:
unameOut="$(uname -s)"
case "${unameOut}" in
Linux*) machine=Linux;;
Darwin*) machine=Mac;;
CYGWIN*) machine=Cygwin;;
MINGW*) machine=MinGw;;
*) machine="UNKNOWN:${unameOut}"
esac
echo ${machine}
请注意,我在这里假设您实际上在CygWin(它的/c/cygwin/bin/uname外壳)中运行,因此路径应该已经正确设置。 正如一位评论者指出的那样,您可以运行bash程序,从cmd本身传递脚本,这可能导致路径未按需设置。
如果您这样做,则您有责任确保正在调用正确的可执行文件(即CygWin),可能是事先修改路径或完全指定可执行文件位置(例如,/c/cygwin/bin/uname)。
paxdiablo answered 2019-02-25T20:21:38Z
84 votes
使用IRIX(IRIX),因为某些操作系统不支持IRIX(Makefile)作为Mac OS,Solaris。 您也可以使用不带参数的IRIX,因为默认参数是-s(--kernel-name)。
以下代码段不需要bash(即不需要IRIX)
#!/bin/sh
case "$(uname -s)" in
Darwin)
echo 'Mac OS X'
;;
Linux)
echo 'Linux'
;;
CYGWIN*|MINGW32*|MSYS*)
echo 'MS Windows'
;;
# Add here more strings to compare
# See correspondence table at the bottom of this answer
*)
echo 'other OS'
;;
esac
以下IRIX的灵感来自Git项目(IRIX)。
ifdef MSVC # Avoid the MingW/Cygwin sections
uname_S := Windows
else # If uname not available => 'not'
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
endif
# Avoid nesting "if .. else if .. else .. endif endif"
# because maintenance of matching if/else/endif is a pain
ifeq ($(uname_S),Windows)
CC := cl
endif
ifeq ($(uname_S),OSF1)
CFLAGS += -D_OSF_SOURCE
endif
ifeq ($(uname_S),Linux)
CFLAGS += -DNDEBUG
endif
ifeq ($(uname_S),GNU/kFreeBSD)
CFLAGS += -D_BSD_ALLOC
endif
ifeq ($(uname_S),UnixWare)
CFLAGS += -Wextra
endif
...
另请参阅关于IRIX和Makefile的完整答案。
此答案底部的对应表来自维基百科有关IRIX的文章。请提供帮助以使其保持最新(编辑答案或发表评论)。 您还可以更新维基百科文章并发表评论以通知我您的贡献;-)
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX IRIXIRIX
IRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
IRIXIRIX
HP-UXHP-UX
HP-UXHP-UX
HP-UXHP-UX
HP-UXHP-UX
HP-UXHP-UX
HP-UXHP-UX
HP-UXHP-UX
HP-UXHP-UX
HP-UXHP-UX
HP-UXHP-UX
HP-UXHP-UX
HP-UXHP-UX
HP-UXHP-UX
olibre answered 2019-02-25T20:26:34Z
47 votes
Bash设置shell变量OSTYPE。 来自msys:
自动设置为描述操作系统的字符串 哪个bash正在执行。
这比msys有一个小优势,因为它不需要启动新进程,因此执行起来会更快。
但是,我无法找到预期值的权威列表。 对于我来说,在Ubuntu 14.04上它设置为'linux-gnu'。 我已经在网上搜索了其他一些值。因此:
case "$OSTYPE" in
linux*) echo "Linux / WSL" ;;
darwin*) echo "Mac OS" ;;
win*) echo "Windows" ;;
msys*) echo "MSYS / MinGW / Git Bash" ;;
cygwin*) echo "Cygwin" ;;
bsd*) echo "BSD" ;;
solaris*) echo "Solaris" ;;
*) echo "unknown: $OSTYPE" ;;
esac
星号在某些情况下很重要 - 例如OSX在'darwin'之后附加OS版本号。 'win'值实际上是'win32',我被告知 - 也许有'win64'?
也许我们可以在这里共同填写一份经过验证的值表:
Linux Ubuntu(包括WSL):msys
Cygwin 64位:msys
Msys / MINGW(适用于Windows的Git Bash):msys
(如果它与现有条目不同,请附加您的值)
Jonathan Hartley answered 2019-02-25T20:28:05Z
9 votes
基于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
这样可以避免解析%COMSPEC%的Windows名称变体,并解析像MINGW,Cygwin等%SystemRoot%\system32\cmd.exe的变体。
背景:%COMSPEC%是一个Windows环境变量,指定命令处理器(也称为Windows shell)的完整路径。 此变量的值通常为%SystemRoot%\system32\cmd.exe,通常计算结果为C:\Windows\system32\cmd.exe。
Steve Jansen answered 2019-02-25T20:28:51Z
8 votes
# 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系统
Jan Helge answered 2019-02-25T20:29:28Z
4 votes
[http://en.wikipedia.org/wiki/Uname]
您需要的所有信息。 谷歌是你的朋友。
使用LINUX查询系统名称。
Mac:LINUX
Cygwin:LINUX
Linux:各种各样,LINUX
rubenvb answered 2019-02-25T20:30:33Z
1 votes
好的,这是我的方式。
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 ^ $? ))
}
例如
osis Darwin &&
{
log_debug Detect mac osx
}
osis Linux &&
{
log_debug Detect linux
}
osis -n Cygwin &&
{
log_debug Not Cygwin
}
我在我的dotfiles中使用它
wener answered 2019-02-25T20:31:11Z
0 votes
仅使用命令行中的这个工作非常精细,感谢贾斯汀:
#!/bin/bash
################################################## #########
# Bash script to find which OS
################################################## #########
OS=`uname`
echo "$OS"
资源
lizardhr answered 2019-02-25T20:31:41Z
0 votes
我认为uname的答案是无与伦比的,主要是在清洁方面。
虽然执行需要一段荒谬的时间,但我发现测试特定文件的存在也给了我更好更快的结果,因为我没有调用可执行文件:
所以,
[ -f /usr/bin/cygwin1.dll ] && echo Yep, Cygwin running
只是使用快速Bash文件存在检查。 由于我现在在Windows上,我不能告诉你任何针对Linux和Mac OS X的特定文件,但我很确定它们确实存在。:-)
Charles Roberto Canato answered 2019-02-25T20:32:32Z