Cygwin, Mac 또는 Linux에서 실행 중인지 확인하는 방법


334

Windows / Cygwin과 Mac 및 Linux 모두에서 사용되는 쉘 스크립트가 있습니다. 버전마다 약간 다른 변수가 필요합니다.

쉘 / bash 스크립트가 Cygwin, Mac 또는 Linux에서 실행 중인지 어떻게 감지 할 수 있습니까?

답변:


322

일반적으로 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

그리고, 매우 도움이에 따라 schot(코멘트에) uname -s제공 DarwinOSX과 Linux내 Cygwin에서이 제공하는 동안, Linux 용 CYGWIN_NT-5.1. 그러나 모든 종류의 다른 버전을 실험해야 할 수도 있습니다.

따라서 bash이러한 검사를 수행 하는 코드는 다음과 같습니다.

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 ( 쉘의 쉘) 내에서 실제로 실행 bash중이므로 경로가 이미 올바르게 설정되어 있다고 가정합니다. 한 주석 작성자가 지적한 것처럼 bash스크립트를 cmd자체적으로 전달 하여 프로그램을 실행할 수 있으며, 필요 에 따라 경로가 설정되지 않을 수 있습니다.

당신이 경우에 하는 그 일을, 그것은 (즉, Cygwin에서 사람이)라고되고 올바른 실행을 보장하기 위해 귀하의 책임 가능성이 경로를 수정 사전 또는 전체 (예를 들어, 실행 파일 위치를 지정하여이다 /c/cygwin/bin/uname).


11
때로는 더 적은 더) BTW, 위키 백과가에 예를 UNAME 출력 테이블이 en.wikipedia.org/wiki/Uname
SCHOT

Windows 7의 Git Bash uname-s 출력은 MINGW32_NT-6.1입니다. 또한, 어떤이 없습니다 /cygdrive만, 접두사 /c를 위해 C:.
ColinM

7
Git Bash는 Cygwin이 아닙니다. MS Windows 용 최소 GNU MinGW이므로 동작이 다릅니다.
Boyd Stephen Smith Jr.

이 답변은 OP 부분을 다루지 않고 다른 답변을 다루기 때문에 다른 답변을 홍보했습니다 How can a shell/bash script detect ....
Jesse Chisholm

"\ cygwin64 \ bin \ bash -c scriptname"을 실행하여 cygwin에서 스크립트를 실행하면 반드시 작동하지는 않습니다. 이 상황에서 cygwin 경로가 설정되지 않고 현재 경로의 첫 번째 항목을 uname -s호출 uname하게됩니다. 내 시스템 geda에서는 텍스트를 반환하는 설치된 버전으로 판명됩니다 WindowsNT. 그러나 위에서 설명한대로 MinGW 버전 일 수도 있습니다. cygwin의 신뢰할 수있는 탐지는 적절하게 설정된 경로 인 IMO에 의존 해서는 안됩니다 . 따라서 cygwin을 감지 $(uname -s)하도록 변경해야합니다 $(/bin/uname -s).
Jules

329

다음은 세 가지 OS 유형 (GNU / Linux, Mac OS X, Windows NT)을 감지하는 데 사용한 bash 스크립트입니다.

주의

  • bash 스크립트 에서 다른 플랫폼의 다른 기본 쉘에 연결된 문제를 방지하기 위해 #!/usr/bin/env bash대신 사용하십시오. 예기치 않은 연산자 와 같은 오류가 있습니다#!/bin/sh/bin/sh 내 컴퓨터에서 발생한 합니다 (Ubuntu 64 비트 12.04).
  • Mac OS X 10.6.8 (Snow Leopard)에는 expr설치하지 않으면 프로그램 이 없으므로 그냥 사용하십시오 uname.

디자인

  1. uname시스템 정보를 얻는 데 사용-s 매개 변수).
  2. 사용 exprsubstr문자열을 다루기 위해 를 .
  3. 사용하다 if elif fi일치하는 작업을 수행하는 데 .
  4. 원하는 경우 시스템 지원을 추가 할 수 있습니다 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, Kernel 3.2.0)는 정상적으로 테스트되었습니다.
  • OS X (10.6.8 Snow Leopard)는 정상적으로 테스트되었습니다.
  • Windows (Windows 7 64 비트)에서 정상으로 테스트되었습니다.

내가 배운 것

  1. 여는 따옴표와 닫는 따옴표를 모두 확인하십시오.
  2. 괄호와 중괄호가 없는지 확인 {}

참고 문헌


MinGW의 경우 다음을 확인하는 것이 더 합리적 일 수 있습니다 [ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]..
Achal Dave

2
@Albert : 표현 "$(expr substr $(uname -s) 1 5)"이 약간 이상합니다. 이를 수행하는 더 예쁜 방법이 있습니다 (예 :) if [ `uname -s` == CYGWIN* ]; then. 읽어 보세요 : CYGWIN으로uname -s 시작 하면 ...
David Ferenczy Rogožan

10
@DawidFerenczy 나는 같이 대괄호를 필요로 생각if [[ $(uname -s) == CYGWIN* ]]; then
rogerdpack

1
질문에서 요청한 것처럼 Cygwin을 감지하지 못합니다.
rmcclellan

2
Linux에서 처음 5 자만 확인하는 이유는 무엇입니까? uname -s"Linux"가 아닌 다른 곳 을 생산할 수 있는 최신 Linux 배포판의 예가 있습니까?
ktbiz

127

사용 uname -s( --kernel-name) 때문에 uname -o( --operating-system)와 같은 일부 운영 체제에서 지원되지 않습니다 맥 OS솔라리스 . 당신은 또한 바로 사용할 수 uname있는 인수없이 기본 인자이기 때문에 -s(--kernel-name ) .

아래 스 니펫은 필요하지 않습니다 (즉 필요하지 않음 #!/bin/bash)

#!/bin/sh

case "$(uname -s)" in

   Darwin)
     echo 'Mac OS X'
     ;;

   Linux)
     echo 'Linux'
     ;;

   CYGWIN*|MINGW32*|MSYS*|MINGW*)
     echo 'MS Windows'
     ;;

   # Add here more strings to compare
   # See correspondence table at the bottom of this answer

   *)
     echo 'Other OS' 
     ;;
esac

아래 Makefile에서 영감 힘내 프로젝트 ( config.mak.uname) .

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
...

에 대한 전체 답변을uname -sMakefile 참조하십시오 .

이 답변의 맨 아래에있는 해당 표는 Wikipedia 기사에 대한 것uname 입니다. 최신 상태로 유지하십시오 (답변을 편집하거나 의견을 게시하십시오). Wikipedia 기사를 업데이트하고 의견을 게시하여 기여에 대해 알려주십시오. ;-)

Operating System uname -s
Mac OS X Darwin
Cygwin 32-bit (Win-XP) CYGWIN_NT-5.1
Cygwin 32-bit (Win-7 32-bit)CYGWIN_NT-6.1
Cygwin 32-bit (Win-7 64-bit)CYGWIN_NT-6.1-WOW64
Cygwin 64-bit (Win-7 64-bit)CYGWIN_NT-6.1
MinGW (Windows 7 32-bit) MINGW32_NT-6.1
MinGW (Windows 10 64-bit) MINGW64_NT-10.0
Interix (Services for UNIX) Interix
MSYS MSYS_NT-6.1
MSYS2 MSYS_NT-10.0-17763
Windows Subsystem for Linux Linux
Android Linux
coreutils Linux
CentOS Linux
Fedora Linux
Gentoo Linux
Red Hat Linux Linux
Linux Mint Linux
openSUSE Linux
Ubuntu Linux
Unity Linux Linux
Manjaro Linux Linux
OpenWRT r40420 Linux
Debian (Linux) Linux
Debian (GNU Hurd) GNU
Debian (kFreeBSD) GNU/kFreeBSD
FreeBSD FreeBSD
NetBSD NetBSD
DragonFlyBSD DragonFly
Haiku Haiku
NonStop NONSTOP_KERNEL
QNX QNX
ReliantUNIX ReliantUNIX-Y
SINIX SINIX-Y
Tru64 OSF1
Ultrix ULTRIX
IRIX 32 bits IRIX
IRIX 64 bits IRIX64
MINIX Minix
Solaris SunOS
UWIN (64-bit Windows 7) UWIN-W7
SYS$UNIX:SH on OpenVMS IS/WB
z/OS USS OS/390
Cray sn5176
(SCO) OpenServer SCO_SV
(SCO) System V SCO_SV
(SCO) UnixWare UnixWare
IBM AIX AIX
IBM i with QSH OS400
HP-UX HP-UX


3
Solaris에 대한 승인 및 위의 연구
okutane

@okutane 님 안녕하세요. 나는 당신이 무슨 뜻인지 이해하지 못합니다. 자세한 내용을 알려주십시오. 당신은 뭔가를 제안합니까? 건배
올리버

3
투표하고 있습니다.
okutane

1
이것은 휴대용 / 크로스 플랫폼을 작성하기 위해 찾고있는 것입니다 ~/.profile( $PATH후손에 대한 검색 키워드를 제공하기 위해 주석 달기 와 같은 환경 변수를 설정 하기 위해).
Braham Snyder

1
WSL을 구체적으로 감지하고 다른 Linux와 차별화하기를 원했기 때문에 여기에 왔습니다. 나를 위해 작동하는 것 같습니다 전에 확인 uname -sr하고 비교하는 것 입니다. Linux*Microsoft)Linux*)
einarmagnus

65

Bash는 쉘 변수 OSTYPE을 설정합니다. 보낸 사람 man bash:

bash가 실행중인 운영 체제를 설명하는 문자열로 자동 설정됩니다.

이것은 uname새로운 프로세스를 시작할 필요가 없다는 점에서 작은 이점 이 있으므로 실행이 더 빠릅니다.

그러나 예상 값의 권위있는 목록을 찾을 수 없습니다. 우분투 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 포함 ) :linux-gnu
  • Cygwin 64 비트 : cygwin
  • Msys / MINGW (Windows 용 Git Bash) : msys

(기존 항목과 다른 경우 값을 추가하십시오)


1
나는 이미 당신의 대답이 내 것보다 더 좋아, 내가 필요했던 드문 시간에 완벽하게 맞습니다
Charles Roberto Canato

6
엄밀히 말해 환경 변수가 아니라 쉘 변수입니다. 그래서 당신은 아래 env | grep OSTYPE에서 그것을 볼 수 없지만 당신은 아래 에서 볼 것입니다set | grep OSTYPE
wisbucky

4
관심있는 사람들을 위해 Bash OSTYPE변수 (conftypes.h) 는 automake OS변수 의 정확한 사본 (Makefile.in)을 사용하여 빌드시 구성됩니다 . 사용 가능한 모든 유형에 대해서는 automake의 lib / config.sub 파일을 참조하십시오 .
jdknight

9

Albert의 답변을 바탕으로 $COMSPECWindows 감지 에 사용 하고 싶습니다 .

#!/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

이렇게하면에 대한 Windows 이름의 $OS변형을 구문 분석하고 unameMINGW, Cygwin 등의 변형을 구문 분석하지 않아도됩니다 .

배경 : %COMSPEC%명령 프로세서 (Windows 쉘)의 전체 경로를 지정하는 Windows 환경 변수입니다. 이 변수의 값은 일반적 %SystemRoot%\system32\cmd.exe으로로 평가됩니다 C:\Windows\system32\cmd.exe.


Windows UWS Bash 환경에서 실행할 때 $ COMSPEC이 설정되지 않았으므로 더 이상 정정하지 마십시오.
Julian Knight

9
# 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 시스템이 가정됩니다.


if [ `uname -s` == CYGWIN* ]; then더 좋아 보이고 동일하게 작동합니다.
David Ferenczy Rogožan

6
예. 그러나 이중 괄호를 사용하십시오 [[ $(uname -s) == CYGWIN* ]]. 우리의 경우 확장 정규 표현식이 더 정확 [[ $(uname -s) =~ ^CYGWIN* ]]합니다.
Andreas Spindler

macOS expr substr $(uname -s) 1 6에서 오류 ( expr: syntax error) 가 발생 하기 때문에 위의 방법이 더 좋습니다 .
doekman

2

좋아, 여기가 내 길이야

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
}

도트 파일 에서 이것을 사용합니다


2

http://en.wikipedia.org/wiki/Uname

필요한 모든 정보. 구글은 당신의 친구입니다.

uname -s시스템 이름을 쿼리하는 데 사용 합니다.

  • 맥: Darwin
  • 사이 그윈 : CYGWIN_...
  • 리눅스 : 다양한 LINUX대부분의

2

이 질문에 Linux 용 Windows 서브 시스템이 존재하지 않았습니다. 내 테스트에서 이러한 결과를 얻었습니다.

uname -s -> Linux
uname -o -> GNU/Linux
uname -r -> 4.4.0-17763-Microsoft

이는 기본 Linux와 구별하기 위해 uname -r이 필요함을 의미합니다.


1
불행히도 Mingw-w64는 정확히 동일합니다.
안개 Fog

1

나는 청결의 관점에서 볼 때 부당한 대답이 무적이라고 생각합니다.

실행하는 데 우스운 시간이 걸리지 만 특정 파일 존재 여부를 테스트하면 실행 파일을 호출하지 않기 때문에 좋은 결과를 얻을 수 있습니다.

그래서,

[ -f /usr/bin/cygwin1.dll ] && echo Yep, Cygwin running

빠른 Bash 파일 존재 확인을 사용합니다. 지금 Windows를 사용하고 있으므로 Linux 및 Mac OS X 용 특정 파일을 내 머리에서 말할 수는 없지만 파일이 존재한다고 확신합니다. :-)


-3

Justin 덕분에 명령 줄에서 이것을 사용하면 매우 잘 작동합니다.

#!/bin/bash

################################################## #########
# Bash script to find which OS
################################################## #########

OS=`uname`
echo "$OS"

출처


스크립트의 새로운 기능
mallaudin 2019
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.