답변:
일반적으로 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).
MINGW32_NT-6.1입니다. 또한, 어떤이 없습니다 /cygdrive만, 접두사 /c를 위해 C:.
How can a shell/bash script detect ....
uname -s호출 uname하게됩니다. 내 시스템 geda에서는 텍스트를 반환하는 설치된 버전으로 판명됩니다 WindowsNT. 그러나 위에서 설명한대로 MinGW 버전 일 수도 있습니다. cygwin의 신뢰할 수있는 탐지는 적절하게 설정된 경로 인 IMO에 의존 해서는 안됩니다 . 따라서 cygwin을 감지 $(uname -s)하도록 변경해야합니다 $(/bin/uname -s).
#!/usr/bin/env bash대신 사용하십시오. 예기치 않은 연산자 와 같은 오류가 있습니다#!/bin/sh/bin/sh 내 컴퓨터에서 발생한 합니다 (Ubuntu 64 비트 12.04).expr설치하지 않으면 프로그램 이 없으므로 그냥 사용하십시오 uname.uname시스템 정보를 얻는 데 사용-s 매개 변수).expr및substr문자열을 다루기 위해 를 .if 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
[ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]..
"$(expr substr $(uname -s) 1 5)"이 약간 이상합니다. 이를 수행하는 더 예쁜 방법이 있습니다 (예 :) if [ `uname -s` == CYGWIN* ]; then. 읽어 보세요 : CYGWIN으로uname -s 시작 하면 ...
if [[ $(uname -s) == CYGWIN* ]]; then
uname -s"Linux"가 아닌 다른 곳 을 생산할 수 있는 최신 Linux 배포판의 예가 있습니까?
사용 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
~/.profile( $PATH후손에 대한 검색 키워드를 제공하기 위해 주석 달기 와 같은 환경 변수를 설정 하기 위해).
uname -sr하고 비교하는 것 입니다. Linux*Microsoft)Linux*)
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-gnucygwinmsys(기존 항목과 다른 경우 값을 추가하십시오)
env | grep OSTYPE에서 그것을 볼 수 없지만 당신은 아래 에서 볼 것입니다set | grep OSTYPE
OSTYPE변수 (conftypes.h) 는 automake OS변수 의 정확한 사본 (Makefile.in)을 사용하여 빌드시 구성됩니다 . 사용 가능한 모든 유형에 대해서는 automake의 lib / config.sub 파일을 참조하십시오 .
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.
# 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더 좋아 보이고 동일하게 작동합니다.
[[ $(uname -s) == CYGWIN* ]]. 우리의 경우 확장 정규 표현식이 더 정확 [[ $(uname -s) =~ ^CYGWIN* ]]합니다.
expr substr $(uname -s) 1 6에서 오류 ( expr: syntax error) 가 발생 하기 때문에 위의 방법이 더 좋습니다 .
좋아, 여기가 내 길이야
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
}
내 도트 파일 에서 이것을 사용합니다
http://en.wikipedia.org/wiki/Uname
필요한 모든 정보. 구글은 당신의 친구입니다.
uname -s시스템 이름을 쿼리하는 데 사용 합니다.
DarwinCYGWIN_...LINUX대부분의나는 청결의 관점에서 볼 때 부당한 대답이 무적이라고 생각합니다.
실행하는 데 우스운 시간이 걸리지 만 특정 파일 존재 여부를 테스트하면 실행 파일을 호출하지 않기 때문에 좋은 결과를 얻을 수 있습니다.
그래서,
[ -f /usr/bin/cygwin1.dll ] && echo Yep, Cygwin running
빠른 Bash 파일 존재 확인을 사용합니다. 지금 Windows를 사용하고 있으므로 Linux 및 Mac OS X 용 특정 파일을 내 머리에서 말할 수는 없지만 파일이 존재한다고 확신합니다. :-)
Justin 덕분에 명령 줄에서 이것을 사용하면 매우 잘 작동합니다.
#!/bin/bash
################################################## #########
# Bash script to find which OS
################################################## #########
OS=`uname`
echo "$OS"