Cygwin, Mac या Linux में रनिंग कैसे करें?


334

मेरे पास एक शेल स्क्रिप्ट है जो विंडोज / सिगविन और मैक और लिनक्स दोनों पर उपयोग की जाती है। यह प्रत्येक संस्करण के लिए थोड़ा अलग चर की जरूरत है।

शेल या बैश स्क्रिप्ट कैसे पता लगा सकती है कि यह सिगविन में चल रहा है, मैक पर या लिनक्स में?

जवाबों:


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 देता है 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) को पूरी तरह से निर्दिष्ट करके ।


11
कभी-कभी कम अधिक होता है;) BTW, विकिपीडिया में en.wikipedia.org/wiki/Uname
schot

विंडोज 7 पर Git Bash uname -s आउटपुट है MINGW32_NT-6.1। इसके अलावा, कोई /cygdriveउपसर्ग नहीं है , बस के /cलिए C:
कॉलिनएम

7
Git बैश Cygwin नहीं है। यह एमएसजी के लिए न्यूनतम जीएनयू है, यही कारण है कि व्यवहार अलग है।
बोयड स्टीफन स्मिथ जूनियर

मैंने दूसरे उत्तर का प्रचार किया क्योंकि यह उत्तर ओपी भाग How can a shell/bash script detect ...और दूसरे के साथ व्यवहार नहीं करता है।
जेसी चिशोल्म

अगर मैं "\ cygwin64 \ bin \ bash -c scriptname" निष्पादित करके cygwin के तहत एक स्क्रिप्ट चलाता हूं, तो यह आवश्यक रूप से काम करता है। इस स्थिति में, साइबरविन पथ सेट नहीं uname -sहोता है और unameआपके वर्तमान पथ में जो कुछ भी है, उसे कॉल करते हुए समाप्त होता है, जो कि मेरे सिस्टम पर वह संस्करण स्थापित किया गया है gedaजिसके साथ पाठ लौटाता है WindowsNT। यह उतना ही MinGW संस्करण हो सकता है, जैसा कि ऊपर वर्णित है, हालांकि। साइबरविन के लिए एक विश्वसनीय पता लगाने के लिए उचित रूप से निर्धारित पथ पर भरोसा नहीं करना चाहिए , आईएमओ। इसलिए, साइबरविन का पता लगाने के लिए $(uname -s)बदला जाना चाहिए $(/bin/uname -s)
जूल्स

329

यहाँ bash script है जिसका मैंने तीन अलग-अलग OS प्रकार (GNU / Linux, Mac OS X, Windows NT) का पता लगाने के लिए उपयोग किया है

ध्यान दें

  • आपकी बैश स्क्रिप्ट में, अलग-अलग प्लेटफ़ॉर्म में अलग-अलग डिफ़ॉल्ट शेल से जुड़े समस्या के निवारण के #!/usr/bin/env bashबजाय उपयोग करें , या अप्रत्याशित ऑपरेटर की तरह त्रुटि होगी , यही मेरे कंप्यूटर (Ubuntu 64 बिट्स 12.04) पर हुआ है।#!/bin/sh/bin/sh
  • मैक ओएस एक्स 10.6.8 (स्नो लेपर्ड) में exprप्रोग्राम नहीं है जब तक कि आप इसे स्थापित नहीं करते हैं, इसलिए मैं अभी उपयोग करता हूं uname

डिज़ाइन

  1. unameसिस्टम जानकारी ( -sपैरामीटर) प्राप्त करने के लिए उपयोग करें ।
  2. का प्रयोग करें exprऔर substrस्ट्रिंग से निपटने के लिए।
  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

परिक्षण

  • लिनक्स (Ubuntu 12.04 LTS, कर्नेल 3.2.0) ने ठीक का परीक्षण किया।
  • OS X (10.6.8 स्नो लेपर्ड) ने ठीक का परीक्षण किया।
  • विंडोज (विंडोज 7 64 बिट) ने ठीक का परीक्षण किया।

मैने क्या सीखा

  1. उद्धरण खोलने और बंद करने दोनों के लिए जाँच करें।
  2. लापता कोष्ठक और ब्रेसिज़ की जाँच करें {}

संदर्भ


MinGW के लिए, यह जाँच करने के लिए अधिक समझ में आता है [ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]:।
अचल दवे

2
@ अल्बर्ट: अभिव्यक्ति "$(expr substr $(uname -s) 1 5)"थोड़ी अजीब है। वहाँ ऐसा करने के लिए, उदाहरण के लिए अधिक सुंदर तरीके हैं: if [ `uname -s` == CYGWIN* ]; then। इसे पढ़ें: अगर CYGWIN केuname -s साथ शुरू होता है तो ...
डेविड फेरेंस्की रोगोजान

10
@DawidFerenczy मेरा मानना ​​है कि इसे 20 ब्रैकेट में डबल ब्रैकेट्स की आवश्यकता होगीif [[ $(uname -s) == CYGWIN* ]]; then
rogerdpack

1
यह Cygwin का पता नहीं लगाता है, जैसा कि प्रश्न में पूछा गया था।
rmcclellan

2
यह लिनक्स के लिए केवल पहले 5 अक्षरों की जाँच क्यों करता है? क्या आधुनिक लिनक्स डिस्ट्रोस के उदाहरण हैं जहां uname -s"लिनक्स" के अलावा कुछ और मिलेगा?
ktbiz

127

उपयोग 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


3
सोलारिस और ऊपर अनुसंधान के लिए अंगूठे।
okutane

हाय @okutane। मुझे समझ नहीं आता तुम्हारा क्या मतलब है। कृपया अधिक जानकारी प्रदान करें। क्या आप कुछ सुझाते हैं? चीयर्स
ओलिब्रे

3
मैं मतदान कर रहा हूं, बस।
okutane

1
यह वही है जो मैं एक पोर्टेबल / क्रॉस-प्लेटफॉर्म लिखने के लिए देख रहा था ~/.profile(पर्यावरण चर सेट करने के लिए जैसे $PATH- पोस्टिंग के लिए खोज कीवर्ड प्रदान करने के लिए टिप्पणी करना)।
ब्रह्मा स्नाइडर

1
मैं यहां इसलिए आया क्योंकि मैं विशेष रूप से डब्ल्यूएसएल का पता लगाना चाहता था, और इसे अन्य लिनक्स से अलग करता था। फिर मेरे लिए काम करना uname -srऔर Linux*Microsoft)पहले के मुकाबले तुलना करना प्रतीत होता है Linux*)
ईनामार्गनस

65

बैश शेल चर 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' है?

शायद हम यहां सत्यापित मानों की एक तालिका बनाने के लिए एक साथ काम कर सकते हैं:

  • लिनक्स उबंटू (incl। WSL ):linux-gnu
  • साइगविन 64-बिट: cygwin
  • Msys / MINGW (विंडोज के लिए गिट मार): msys

(मौजूदा प्रविष्टियों से अलग होने पर कृपया अपना मूल्य बढ़ाएँ)


1
मुझे आपका जवाब पहले से ही अधिक पसंद है, मैं पूरी तरह से उस दुर्लभ समय पर फिट बैठता हूं जिसकी मुझे आवश्यकता है
चार्ल्स रॉबर्टो कैनाटो

6
तकनीकी रूप से, यह एक पर्यावरण चर नहीं है, यह एक शेल चर है। इसीलिए आप इसे नहीं देखेंगे env | grep OSTYPE, लेकिन आप इसे अंडरset | grep OSTYPE
वारबैंक

4
रुचि रखने वालों के लिए, बैश के OSTYPEचर (conftypes.h) को आटोमैटिकOS चर (Makefile.in) की सटीक प्रतिलिपि का उपयोग करके बिल्ड समय पर कॉन्फ़िगर किया गया है । सभी प्रकारों के लिए एक व्यक्ति ऑटोमैटिक लीब / config.sub फ़ाइल से परामर्श कर सकता है ।
1948 में

9

अल्बर्ट के उत्तर का निर्माण करने के लिए, मुझे $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


Windows UWS बैश वातावरण के तहत चलने पर $ COMSPEC के रूप में सेट नहीं किया गया कोई भी सही नहीं है।
जूलियन नाइट

9
# 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बेहतर दिखता है और वही काम करता है।
डेविड फेरेंस्की रोगोजान

6
हां, लेकिन डबल ब्रैकेट का उपयोग करें [[ $(uname -s) == CYGWIN* ]]:। ध्यान दें कि विस्तारित नियमित अभिव्यक्तियाँ हमारे मामले में अधिक सटीक हैं [[ $(uname -s) =~ ^CYGWIN* ]]:।
एंड्रियास स्पिंडलर

ऊपर बेहतर काम करता है, क्योंकि macOS पर expr substr $(uname -s) 1 6एक त्रुटि ( expr: syntax error) देता है ।
डॉकमैन

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
}

मैं अपने में इस का उपयोग dotfiles


2

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

सभी जानकारी जो आपको कभी भी आवश्यकता होगी। Google आपका मित्र है

uname -sसिस्टम नाम को क्वेरी करने के लिए उपयोग करें ।

  • मैक: Darwin
  • Cygwin: CYGWIN_...
  • लिनक्स: विभिन्न, LINUXअधिकांश के लिए

2

जब यह प्रश्न पूछा गया तो लिनक्स के लिए विंडोज सबसिस्टम मौजूद नहीं था। इसने मेरे परीक्षा में ये परिणाम दिए:

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

इसका मतलब यह है कि आपको मूल लिनक्स से इसे अलग करने के लिए uname -r की आवश्यकता है।


1
दुर्भाग्य से, मिंगव-डब्ल्यू 64 बिल्कुल वैसा ही देता है।
एक कोहरा

1

मुझे लगता है कि अप्रकाशित उत्तर अपराजेय है, मुख्यतः स्वच्छता के संदर्भ में।

यद्यपि इसे निष्पादित करने के लिए एक हास्यास्पद समय लगता है, मैंने पाया कि विशिष्ट फ़ाइलों की उपस्थिति के लिए परीक्षण भी मुझे अच्छे और तेज परिणाम देता है, क्योंकि मैं एक निष्पादन योग्य को आमंत्रित नहीं कर रहा हूं:

इसलिए,

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

बस एक त्वरित बैश फ़ाइल उपस्थिति जांच का उपयोग करता है। जैसा कि मैं अभी विंडोज पर हूं, मैं आपको अपने सिर से लिनक्स और मैक ओएस एक्स के लिए कोई विशेष फाइल नहीं बता सकता, लेकिन मुझे पूरा यकीन है कि वे मौजूद हैं। :-)


-3

यह केवल कमांड लाइन से बहुत ठीक काम करता है का उपयोग करें, जस्टिन के लिए धन्यवाद:

#!/bin/bash

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

OS=`uname`
echo "$OS"

स्रोत


आपकी स्क्रिप्ट में नया क्या है?
मल्लाउद्दीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.