mac检测不到linux,bash - 如何检查是否在Cygwin,Mac或Linux中运行?

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值