जवाबों:
आमतौर पर, 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 देता है 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}
ध्यान दें कि मैं यह मान रहा हूं कि आप वास्तव में साइगविन (इसके bashखोल) के भीतर चल रहे हैं, इसलिए पहले से ही सही तरीके से रास्ते स्थापित किए जाने चाहिए। जैसा कि एक टिप्पणीकार नोट करता है, आप bashप्रोग्राम को चला सकते हैं , स्क्रिप्ट पास कर सकते हैं , cmdइसके परिणामस्वरूप और आवश्यकतानुसार पथ सेट नहीं हो सकते हैं।
यदि आप ऐसा कर रहे हैं, तो यह आपकी जिम्मेदारी है कि आप सही निष्पादनों को सुनिश्चित करें (अर्थात, साइगविन वाले) कहे जा रहे हैं, संभवतः पहले से पथ को संशोधित करके या निष्पादन योग्य स्थानों (जैसे, /c/cygwin/bin/uname) को पूरी तरह से निर्दिष्ट करके ।
MINGW32_NT-6.1। इसके अलावा, कोई /cygdriveउपसर्ग नहीं है , बस के /cलिए C:।
How can a shell/bash script detect ...और दूसरे के साथ व्यवहार नहीं करता है।
uname -sहोता है और unameआपके वर्तमान पथ में जो कुछ भी है, उसे कॉल करते हुए समाप्त होता है, जो कि मेरे सिस्टम पर वह संस्करण स्थापित किया गया है gedaजिसके साथ पाठ लौटाता है WindowsNT। यह उतना ही MinGW संस्करण हो सकता है, जैसा कि ऊपर वर्णित है, हालांकि। साइबरविन के लिए एक विश्वसनीय पता लगाने के लिए उचित रूप से निर्धारित पथ पर भरोसा नहीं करना चाहिए , आईएमओ। इसलिए, साइबरविन का पता लगाने के लिए $(uname -s)बदला जाना चाहिए $(/bin/uname -s)।
#!/usr/bin/env bashबजाय उपयोग करें , या अप्रत्याशित ऑपरेटर की तरह त्रुटि होगी , यही मेरे कंप्यूटर (Ubuntu 64 बिट्स 12.04) पर हुआ है।#!/bin/sh/bin/shexprप्रोग्राम नहीं है जब तक कि आप इसे स्थापित नहीं करते हैं, इसलिए मैं अभी उपयोग करता हूं 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"लिनक्स" के अलावा कुछ और मिलेगा?
उपयोग uname -s( --kernel-name) क्योंकि uname -o( --operating-system) मैक ओएस और सोलारिस जैसे कुछ ऑपरेटिंग सिस्टम पर समर्थित नहीं है । डिफ़ॉल्ट तर्क है ( ) के बाद से आप 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 -sऔरMakefile ।
इस उत्तर के तल में पत्राचार तालिका विकिपीडिया लेख के बारे में हैuname । कृपया इसे अद्यतन रखने के लिए योगदान दें (उत्तर को संपादित करें या टिप्पणी पोस्ट करें)। आप विकिपीडिया लेख को भी अपडेट कर सकते हैं और अपने योगदान के बारे में मुझे सूचित करने के लिए एक टिप्पणी पोस्ट कर सकते हैं ;-)
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*)।
बैश शेल चर OSTYPE सेट करता है। से man bash:
स्वचालित रूप से एक स्ट्रिंग पर सेट होता है जो ऑपरेटिंग सिस्टम का वर्णन करता है जिस पर बैश निष्पादित हो रहा है।
इसमें एक छोटा फायदा unameयह है कि इसे एक नई प्रक्रिया शुरू करने की आवश्यकता नहीं है, इसलिए इसे निष्पादित करने की जल्दी होगी।
हालाँकि, मैं अपेक्षित मूल्यों की एक आधिकारिक सूची नहीं पा रहा हूँ। मेरे लिए 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 'डार्विन' के बाद एक OS संस्करण संख्या को जोड़ता है। 'जीत' मूल्य वास्तव में 'win32' है, मुझे बताया गया है - शायद कोई 'win64' है?
शायद हम यहां सत्यापित मानों की एक तालिका बनाने के लिए एक साथ काम कर सकते हैं:
linux-gnucygwinmsys(मौजूदा प्रविष्टियों से अलग होने पर कृपया अपना मूल्य बढ़ाएँ)
env | grep OSTYPE, लेकिन आप इसे अंडरset | grep OSTYPE
OSTYPEचर (conftypes.h) को आटोमैटिकOS चर (Makefile.in) की सटीक प्रतिलिपि का उपयोग करके बिल्ड समय पर कॉन्फ़िगर किया गया है । सभी प्रकारों के लिए एक व्यक्ति ऑटोमैटिक लीब / config.sub फ़ाइल से परामर्श कर सकता है ।
अल्बर्ट के उत्तर का निर्माण करने के लिए, मुझे $COMSPECविंडोज का पता लगाने के लिए उपयोग करना पसंद है :
#!/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पार्सिंग वेरिएंट, और unameMINGW, साइगविन, इत्यादि के पर्सेंटेज वेरिएशन से बचा जाता है ।
पृष्ठभूमि: %COMSPEC%एक विंडोज़ पर्यावरण चर है जो कमांड प्रोसेसर (उर्फ विंडोज शेल) के लिए पूर्ण पथ निर्दिष्ट करता है। इस चर का मूल्य आम तौर पर होता है %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
यदि अनाम कमांड का 6 पहला वर्ण "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
}
मैं अपने में इस का उपयोग dotfiles
http://en.wikipedia.org/wiki/Uname
सभी जानकारी जो आपको कभी भी आवश्यकता होगी। Google आपका मित्र है
uname -sसिस्टम नाम को क्वेरी करने के लिए उपयोग करें ।
DarwinCYGWIN_...LINUXअधिकांश के लिएजब यह प्रश्न पूछा गया तो लिनक्स के लिए विंडोज सबसिस्टम मौजूद नहीं था। इसने मेरे परीक्षा में ये परिणाम दिए:
uname -s -> Linux
uname -o -> GNU/Linux
uname -r -> 4.4.0-17763-Microsoft
इसका मतलब यह है कि आपको मूल लिनक्स से इसे अलग करने के लिए uname -r की आवश्यकता है।
मुझे लगता है कि अप्रकाशित उत्तर अपराजेय है, मुख्यतः स्वच्छता के संदर्भ में।
यद्यपि इसे निष्पादित करने के लिए एक हास्यास्पद समय लगता है, मैंने पाया कि विशिष्ट फ़ाइलों की उपस्थिति के लिए परीक्षण भी मुझे अच्छे और तेज परिणाम देता है, क्योंकि मैं एक निष्पादन योग्य को आमंत्रित नहीं कर रहा हूं:
इसलिए,
[ -f /usr/bin/cygwin1.dll ] && echo Yep, Cygwin running
बस एक त्वरित बैश फ़ाइल उपस्थिति जांच का उपयोग करता है। जैसा कि मैं अभी विंडोज पर हूं, मैं आपको अपने सिर से लिनक्स और मैक ओएस एक्स के लिए कोई विशेष फाइल नहीं बता सकता, लेकिन मुझे पूरा यकीन है कि वे मौजूद हैं। :-)
यह केवल कमांड लाइन से बहुत ठीक काम करता है का उपयोग करें, जस्टिन के लिए धन्यवाद:
#!/bin/bash
################################################## #########
# Bash script to find which OS
################################################## #########
OS=`uname`
echo "$OS"