कैसे एक बैश स्क्रिप्ट से ओएस का पता लगाने के लिए?


524

मैं अपने .bashrcऔर .bash_loginफाइलों को संस्करण नियंत्रण में रखना चाहूंगा ताकि मैं उन सभी कंप्यूटरों के बीच उपयोग कर सकूं जिनका मैं उपयोग करता हूं। समस्या यह है कि मेरे पास कुछ ओएस विशिष्ट उपनाम हैं इसलिए मैं यह निर्धारित करने के लिए एक रास्ता खोज रहा था कि क्या स्क्रिप्ट मैक ओएस एक्स, लिनक्स या साइगविन पर चल रही है

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


1
क्या आपने कभी अपने कॉन्फ़िगरेशन को साझा करने पर विचार किया है? मैं उसी तरह का सेटअप प्राप्त करना
चाह

@sorin मैं जानता हूँ कि यह एक पुरानी टिप्पणी है, लेकिन अगर आप अभी भी उत्सुक हैं, मैं निर्माण किया गया है ProfileGem जो आप अपने सभी मशीनों के लिए प्लगेबल बैश वातावरण कॉन्फ़िगर करने देता है।
dimo414

1
@ dimo414 profilegem यहां ले जाया गया लगता है bitbucket.org/dimo414/profilegem । जहाँ तक सामान्य रूप से बैश कॉन्फिग साझा करने की बात है, इन डॉटफाइल्स प्रोजेक्ट्स में से कुछ को आज़माएँ: github.com/…
mahemoff

1
@mahemoff अद्यतन लिंक के लिए धन्यवाद, क्षमा करें मैं अपनी टिप्पणी संपादित नहीं कर सकता। यदि आप ProfileGem के साथ प्रयोग कर रहे हैं तो मैं प्रतिक्रिया या बग का स्वागत करूँगा!
dimo414

Alas BitBucket Mercurial समर्थन को बंद कर रहा है, इसलिए मुझे अपना लिंक फिर से अपडेट करना होगा :( github.com/dimo414/ProfileGem नया घर है।
dimo414

जवाबों:


521

मुझे लगता है कि निम्नलिखित को काम करना चाहिए। मैं win32हालांकि इसके बारे में निश्चित नहीं हूं ।

if [[ "$OSTYPE" == "linux-gnu"* ]]; then
        # ...
elif [[ "$OSTYPE" == "darwin"* ]]; then
        # Mac OSX
elif [[ "$OSTYPE" == "cygwin" ]]; then
        # POSIX compatibility layer and Linux environment emulation for Windows
elif [[ "$OSTYPE" == "msys" ]]; then
        # Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
elif [[ "$OSTYPE" == "win32" ]]; then
        # I'm not sure this can happen.
elif [[ "$OSTYPE" == "freebsd"* ]]; then
        # ...
else
        # Unknown.
fi

7
Windows पर, आपको msysGit Bash / msysGit, और cygwinCygwin के लिए
मिलेगा

1
विंडोज के लिए कैसे पता लगाएं सहित यह उत्तर अच्छा है। मैं भी Mingw32 उपयोग कर रहा हूँ और यह रूप में आता हैmsys
D48

2
दिलचस्प है .. मैक OSX अभी भी 'डार्विन' देगा।
जोनाथनबेल

6
जब आप टिप्पणी को किसी आदेश के साथ प्रतिस्थापित करते हैं, तो मेरे साथ कुछ गड़बड़ हो जाती है - साथ समाप्त करना सुनिश्चित करें ;
वादिम पेरिटोकिन

1
जब मैं एक कमांड जोड़ता हूं source somefile ; , तो मुझे मिलता है syntax error near unexpected token elif
oarfish 20

291

मेरे .bashrc के लिए, मैं निम्नलिखित कोड का उपयोग करता हूं:

platform='unknown'
unamestr=`uname`
if [[ "$unamestr" == 'Linux' ]]; then
   platform='linux'
elif [[ "$unamestr" == 'FreeBSD' ]]; then
   platform='freebsd'
fi

फिर मैं कुछ काम करता हूं जैसे:

if [[ $platform == 'linux' ]]; then
   alias ls='ls --color=auto'
elif [[ $platform == 'freebsd' ]]; then
   alias ls='ls -G'
fi

यह बदसूरत है, लेकिन यह काम करता है। यदि आप चाहें तो caseइसके बजाय आप इसका उपयोग ifकर सकते हैं।


6
आप सिर्फ बेईमान का उपयोग करने के बजाय, बेमेल से मंच क्यों सेट करते हैं?
csexton

80
बैकटिक का उपयोग न करें, नए क्लीयर सिंटैक्स का उपयोग करें: "अनमैस्ट्र = $ (नाम)"।
खोलना

14
एक त्वरित नज़र से, बैकटिक्स एक स्ट्रिंग जैसा दिख सकता है।
हैरिसन पॉवर्स

29
@ david-winiecki क्योंकि अगर आपको आदेशों को घोंसले में रखने की जरूरत है जैसे $ (कमांड -1 $ (कमांड -2))
माइकल बार्टन

3
क्या ऐसा करना बेहतर नहीं होगा: platform="$(uname | tr '[:upper:]' '[:lower:]')"और फिर निश्चित रूप से एक मामले में संभालना होगा? यह सिर्फ बहुत विशिष्ट उत्पादन पर निर्भरता को हार्डकोड करने के लिए अजीब लगता है।
ब्रैंडन बक

274

बैश मैनपेज का कहना है कि चर OSTYPE ऑपरेशन सिस्टम का नाम संग्रहीत करता है:

OSTYPEस्वचालित रूप से एक स्ट्रिंग पर सेट होता है जो ऑपरेटिंग सिस्टम का वर्णन करता है जिस पर बैश निष्पादित हो रहा है। डिफ़ॉल्ट प्रणाली पर निर्भर है।

यह linux-gnuयहाँ पर सेट है।


5
इसके अलावा, $ OSTYPE मेरे मैक (तेंदुए) पर 'darwin9.0' और Cygwin के तहत 'cygwin' है।
डीएफ।

5
$ OSTYPE स्नो लेपर्ड पर darwin10.0 है। संस्करण के साथ डब्ल्यूटीएफ संलग्न? मतलब एक साधारण केस स्टेटमेंट काम नहीं करेगा।
mxcl 14

16
इसे हटाने के लिए यह एक बड़ी बात नहीं है:os=${OSTYPE//[0-9.]/}
ABA

86
case $OSTYPE in darwin*) echo I am a Mac ;; esac
तिहरा

36
@tripleee या ऐसे लोगों के लिए जो "अगर" वाक्यविन्यास के साथ अधिक सहज हैं:if [[ $OSTYPE == darwin* ]]; then echo I am a Mac;fi
Rican7

157

$OSTYPE

आप पहले से परिभाषित $OSTYPEचर का उपयोग कर सकते हैं जैसे:

case "$OSTYPE" in
  solaris*) echo "SOLARIS" ;;
  darwin*)  echo "OSX" ;; 
  linux*)   echo "LINUX" ;;
  bsd*)     echo "BSD" ;;
  msys*)    echo "WINDOWS" ;;
  *)        echo "unknown: $OSTYPE" ;;
esac

हालाँकि यह पुराने गोले (जैसे बॉर्न शेल ) द्वारा मान्यता प्राप्त नहीं है


uname

एक और तरीका है unameकमांड के आधार पर प्लेटफॉर्म का पता लगाना ।

निम्नलिखित स्क्रिप्ट देखें (.bashrc में शामिल करने के लिए तैयार):

# Detect the platform (similar to $OSTYPE)
OS="`uname`"
case $OS in
  'Linux')
    OS='Linux'
    alias ls='ls --color=auto'
    ;;
  'FreeBSD')
    OS='FreeBSD'
    alias ls='ls -G'
    ;;
  'WindowsNT')
    OS='Windows'
    ;;
  'Darwin') 
    OS='Mac'
    ;;
  'SunOS')
    OS='Solaris'
    ;;
  'AIX') ;;
  *) ;;
esac

आप मेरे कुछ व्यावहारिक उदाहरण पा सकते हैं.bashrc


यहां ट्रैविस सीआई पर इस्तेमाल किया गया समान संस्करण है :

case $(uname | tr '[:upper:]' '[:lower:]') in
  linux*)
    export TRAVIS_OS_NAME=linux
    ;;
  darwin*)
    export TRAVIS_OS_NAME=osx
    ;;
  msys*)
    export TRAVIS_OS_NAME=windows
    ;;
  *)
    export TRAVIS_OS_NAME=notset
    ;;
esac

1
$ OSTYPE चेक साइबरविन के लिए एक शाखा को याद कर रहा है, जो एक विंडोज़ मशीन को इंगित करेगा। अनाम चेक ठीक से काम नहीं करेगा, या तो cygwin uname रिटर्न "CYGWIN_NT-10.0" पर और MinGW uname रिटर्न "MINGW64_NT-10.0" पर।
मैट पेनिंगटन

1
उर्फ ls = '/ bin / ls जी' वास्तव में ओएस आधारित थके हुए लोगों के संदर्भ में देखना सुरक्षित विकल्प है, superuser.com/a/1299969/84662
आंद्रेई Neculau

मैं सुझाव देता हूं कि unameओरेकल ने कन्वेंशन को ग्लॉस किया है और उनके साथ एक फ्री वर्जन स्ट्रिंग रखा है OSTYPE ==> solaris2.11unameथोड़ा क्लीनर और कम काम करना है।
होगा

37

पता लगा रहा ऑपरेटिंग सिस्टम और सीपीयू प्रकार इतना आसान करने के लिए नहीं है portably । मेरे पास shलगभग 100 लाइनों की एक स्क्रिप्ट है जो यूनिक्स प्लेटफार्मों की एक बहुत विस्तृत विविधता पर काम करती है: किसी भी प्रणाली का उपयोग मैंने 1988 से किया है।

प्रमुख तत्व हैं

  • uname -pहै प्रोसेसर प्रकार लेकिन आम तौर पर है unknownआधुनिक यूनिक्स प्लेटफार्मों पर।

  • uname -m कुछ यूनिक्स सिस्टम पर "मशीन हार्डवेयर नाम" देगा।

  • /bin/arch, अगर यह मौजूद है, तो आमतौर पर प्रोसेसर का प्रकार देगा।

  • uname किसी भी तर्क के साथ ऑपरेटिंग सिस्टम का नाम नहीं होगा।

आखिरकार आपको प्लेटफार्मों के बीच के अंतरों के बारे में सोचना होगा और आप उन्हें कैसे ठीक करना चाहते हैं। उदाहरण के लिए, बस इसे आसान बनाने के लिए, मैं इलाज i386के माध्यम से i686किसी भी ", Pentium*" और किसी भी " AMD*Athlon*सभी के रूप में" x86

मेरा ~/.profileस्टार्टअप पर एक स्क्रिप्ट चलती है जो एक चर को सीपीयू और ऑपरेटिंग सिस्टम के संयोजन को दर्शाता है। मैं प्लेटफ़ॉर्म-विशिष्ट है bin, man, lib, और includeउसके आधार पर निर्देशिकाओं की स्थापना के लिये। फिर मैंने पर्यावरण चर का एक नाव लोड किया। उदाहरण के लिए, सुधारक मेल को शेल स्क्रिप्ट कह सकते हैं, उदाहरण के लिए, $LIB/mailfmtजो एक प्लेटफ़ॉर्म-विशिष्ट निष्पादन योग्य बाइनरी है।

यदि आप कोनों में कटौती करना चाहते हैं , uname -mऔर सादे unameआपको बताएंगे कि आप कई प्लेटफार्मों पर क्या जानना चाहते हैं। जरूरत पड़ने पर अन्य सामान जोड़ें। (और उपयोग करें case, नस्टेड नहीं if!)


2
Uname Command के अनुसार , एक पैरामीटर के बिना uname "-s" पैरामीटर का उपयोग करने के बराबर है: "-s सिस्टम नाम प्रदर्शित करता है। यह ध्वज डिफ़ॉल्ट रूप से है।" स्पष्ट रूप से कहा जाए तो "अनाम" के बजाय "अनाम -s" का उपयोग किया जा सकता है। ( 'शेल आउटपुट हेल्प' के उत्तर में कुछ विस्तार से )
पीटर मॉर्टेंसन

क्या आपके पास जीआईटब गिट या पेस्टेबिन का लिंक है, जो कि ओएस और प्रोसेसर आर्किटेक्चर का मज़बूती से पता लगाने के लिए इस 100 स्क्रिप्ट के साथ है?
एंड्रयू डी एंड्रेड

4
@AndrewDeAndrade इस कोड को जनता के सामने लाने में मुझे शर्म आ रही है। pastebin.com/J66Lj6wf
नॉर्मन राम्से

तो कैसे uname -s?
अलेक्जेंडर मिल्स

35

मैं इस पूरे बैश कोड का उपयोग करने की सलाह देता हूं

lowercase(){
    echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
}

OS=`lowercase \`uname\``
KERNEL=`uname -r`
MACH=`uname -m`

if [ "{$OS}" == "windowsnt" ]; then
    OS=windows
elif [ "{$OS}" == "darwin" ]; then
    OS=mac
else
    OS=`uname`
    if [ "${OS}" = "SunOS" ] ; then
        OS=Solaris
        ARCH=`uname -p`
        OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
    elif [ "${OS}" = "AIX" ] ; then
        OSSTR="${OS} `oslevel` (`oslevel -r`)"
    elif [ "${OS}" = "Linux" ] ; then
        if [ -f /etc/redhat-release ] ; then
            DistroBasedOn='RedHat'
            DIST=`cat /etc/redhat-release |sed s/\ release.*//`
            PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
            REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
        elif [ -f /etc/SuSE-release ] ; then
            DistroBasedOn='SuSe'
            PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
            REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
        elif [ -f /etc/mandrake-release ] ; then
            DistroBasedOn='Mandrake'
            PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
            REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
        elif [ -f /etc/debian_version ] ; then
            DistroBasedOn='Debian'
            DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F=  '{ print $2 }'`
            PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F=  '{ print $2 }'`
            REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F=  '{ print $2 }'`
        fi
        if [ -f /etc/UnitedLinux-release ] ; then
            DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
        fi
        OS=`lowercase $OS`
        DistroBasedOn=`lowercase $DistroBasedOn`
        readonly OS
        readonly DIST
        readonly DistroBasedOn
        readonly PSUEDONAME
        readonly REV
        readonly KERNEL
        readonly MACH
    fi

fi

यहाँ और अधिक उदाहरण उदाहरण: https://github.com/coto/server-easy-install/blob/master/lib/shsh .sh


1
आपने लोअरकेस फ़ंक्शन को छोड़ दिया, मैंने आपके लिए अपना उत्तर अपडेट कर दिया।
रॉबिन 5:17 पर

1
एक बार जब आप यह जान लेते हैं कि यह लिनक्स है, अगर आप बस इधर-उधर घूम रहे हैं (पता लगाने को स्वचालित करने की कोशिश नहीं कर रहे हैं) ऐसा लगता है कि यह सबसे आसान कदम है, बस ls /etc"ब्ला-रिलीज़" की तलाश करें - जो कुछ भी ब्लाह है, वह है लिनक्स ओएस - सेंटो, उबंटू , इत्यादि
क्रिस मोसचिनी

मैंने संपादित किया क्योंकि OS चर के कुछ संदर्भ "{$ OS}" के रूप में लिखे गए थे, मैंने उन्हें "$ {OS}" में बदल दिया, यही सही तरीका है, मैंने इसका परीक्षण किया
bazz

क्या आप स्क्रिप्ट के बहुत अंत में "इको $ {OS}" जोड़ना चाहेंगे?
ओलेग कोकोरिन

10

दस्तावेज के रूप में बाश में, उपयोग $OSTYPEऔर $HOSTTYPE; मैं यह करता हूं। यदि वह पर्याप्त नहीं है, और यदि unameया uname -a(या अन्य उपयुक्त विकल्प) भी पर्याप्त जानकारी नहीं देते हैं, तो हमेशा GN.U प्रोजेक्ट की config.guess स्क्रिप्ट होती है, जो इस उद्देश्य के लिए बनाई गई है।


10

मैं इनमें से कुछ उत्तरों से बचने का सुझाव दूंगा। यह मत भूलो कि आप स्ट्रिंग तुलना के अन्य रूपों को चुन सकते हैं, जो कि अधिकांश विविधताओं, या बदसूरत कोड की पेशकश को साफ कर देंगे।

इस तरह का एक समाधान एक सरल जाँच होगी, जैसे:

if [[ "$OSTYPE" =~ ^darwin ]]; then

जिसे डार्विन के किसी भी संस्करण से मेल खाने का अतिरिक्त लाभ है, इसके बावजूद यह संस्करण प्रत्यय है। यह भी Linuxउम्मीद कर सकते हैं कि किसी भी रूपांतरों के लिए काम करता है।

तुम मेरे dotfiles भीतर कुछ अतिरिक्त उदाहरण देख सकते हैं यहां


9

"अनाम" का उपयोग करने का प्रयास करें। उदाहरण के लिए, लिनक्स में: "uname -a"।

मैनुअल पेज के अनुसार, नाम SVr4 और POSIX के अनुरूप है, इसलिए यह Mac OS X और Cygwin पर भी उपलब्ध होना चाहिए , लेकिन मैं इसकी पुष्टि नहीं कर सकता।

BTW: $ OSTYPE भी linux-gnuयहाँ सेट है :)


मापदंडों के बिना, मैक ओएस एक्स (तेंदुए) पर 'डार्विन' प्रिंट। -A के साथ यह पूरी तरह से अतिरिक्त जानकारी (कर्नेल संस्करण, वास्तुकला और कुछ और जिसे मैं समझ नहीं सकता हूं) प्रिंट करता है। मैं
साइबरविन

8

मैंने इन शर्करा को अपने में लिखा .bashrc:

if_os () { [[ $OSTYPE == *$1* ]]; }
if_nix () { 
    case "$OSTYPE" in
        *linux*|*hurd*|*msys*|*cygwin*|*sua*|*interix*) sys="gnu";;
        *bsd*|*darwin*) sys="bsd";;
        *sunos*|*solaris*|*indiana*|*illumos*|*smartos*) sys="sun";;
    esac
    [[ "${sys}" == "$1" ]];
}

तो मैं सामान की तरह कर सकते हैं:

if_nix gnu && alias ls='ls --color=auto' && export LS_COLORS="..."
if_nix bsd && export CLICOLORS=on && export LSCOLORS="..."
if_os linux && alias psg="ps -FA | grep" #alternative to pgrep
if_nix bsd && alias psg="ps -alwx | grep -i" #alternative to pgrep
if_os darwin && alias finder="open -R"

BTW, ये 9 लाइनें किसी भी चीज पर चलने वाले किसी भी बैश पर काम करती हैं। कोई शेलआउट नहीं है और लगभग किसी भी व्यक्तिगत शैली के साथ काम करता है। बशकोर्ट (बड़े नेस्टेड / केस ट्री या बहुत सारे यादृच्छिक उपनाम)। IMO, इसके ऊपर के हर उत्तर पर पैंट उतार देता है।

अब तक,
साइगविन

उन उपयोगकर्ताओं के लिए पूरा करें जो आज प्रासंगिक हैं और बैश चलाते हैं। AIX / HP-UX / IRIX / ओपन VMS उपयोगकर्ताओं झंकार सकता है। लिनक्स के लिए नए विंडोज सबसिस्टम Ubuntu amd64 के एक शेयर को स्थापित करने के लिए तो यह दोनों सही लौटना चाहिए चलाता है if_nix gnuऔर if_os linux
किफ्फ

1
@kfix हाँ यह सही है, जीत 10 bash सबसिस्टम "linux-gnu" के लिए आउटपुट करता है echo $OSTYPE। विशेष रूप से 10 bash सबसिस्टम जीतने का पता लगाने के लिए, मुझे जो एकमात्र समाधान मिला है, वह "Microsoft" के लिए जांचना था/proc/sys/kernel/osrelease
Jpnh


7

मैंने एक व्यक्तिगत बैश लाइब्रेरी और स्क्रिप्टिंग फ्रेमवर्क लिखा है जो कि एक सटीक प्लेटफॉर्म का पता लगाने के लिए GNU shtool का उपयोग करता है ।

GNU shtool लिपियों का एक बहुत ही पोर्टेबल सेट है जिसमें अन्य उपयोगी चीजों के अलावा, 'shtool platform' कमांड शामिल है। यहाँ का उत्पादन है:

shtool platform -v -F "%sc (%ac) %st (%at) %sp (%ap)"

कुछ अलग मशीनों पर:

Mac OS X Leopard: 
    4.4BSD/Mach3.0 (iX86) Apple Darwin 9.6.0 (i386) Apple Mac OS X 10.5.6 (iX86)

Ubuntu Jaunty server:
    LSB (iX86) GNU/Linux 2.9/2.6 (i686) Ubuntu 9.04 (iX86)

Debian Lenny:
    LSB (iX86) GNU/Linux 2.7/2.6 (i686) Debian GNU/Linux 5.0 (iX86)

यह बहुत संतोषजनक परिणाम पैदा करता है, जैसा कि आप देख सकते हैं। GNU shtool थोड़ी धीमी है, इसलिए मैं वास्तव में सिस्टम पर एक फ़ाइल में प्लेटफ़ॉर्म की पहचान को संग्रहीत करता हूं और अपडेट करता हूं जिसे मेरी स्क्रिप्ट्स कॉल करती हैं। यह मेरा ढांचा है, इसलिए यह मेरे लिए काम करता है, लेकिन आपका माइलेज अलग हो सकता है।

अब, आपको अपनी स्क्रिप्ट के साथ shtool को पैकेज करने का एक तरीका खोजना होगा, लेकिन यह एक कठिन व्यायाम नहीं है। आप हमेशा बिना आउटपुट के भी पीछे जा सकते हैं।

संपादित करें:

मुझे टेडी द्वारा पोस्ट config.guess(किसी तरह) के बारे में याद आया । ये बहुत ही समान स्क्रिप्ट हैं, लेकिन समान नहीं हैं। मैं व्यक्तिगत रूप से अन्य उपयोगों के लिए भी shtool का उपयोग करता हूं, और यह मेरे लिए काफी अच्छा काम कर रहा है।



6

इसके नीचे डेबियन और RedHat आधारित का पता लगाने के लिए एक दृष्टिकोण है लिनक्स ओएस का इस्तेमाल कर रही / etc / LSB रिलीज और / etc / ओएस रिलीज (लिनक्स स्वाद आप उपयोग कर रहे हैं पर निर्भर करता है) और उस पर आधारित एक सरल कार्रवाई करें।

#!/bin/bash
set -e

YUM_PACKAGE_NAME="python python-devl python-pip openssl-devel"
DEB_PACKAGE_NAME="python2.7 python-dev python-pip libssl-dev"

 if cat /etc/*release | grep ^NAME | grep CentOS; then
    echo "==============================================="
    echo "Installing packages $YUM_PACKAGE_NAME on CentOS"
    echo "==============================================="
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Red; then
    echo "==============================================="
    echo "Installing packages $YUM_PACKAGE_NAME on RedHat"
    echo "==============================================="
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Fedora; then
    echo "================================================"
    echo "Installing packages $YUM_PACKAGE_NAME on Fedorea"
    echo "================================================"
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Ubuntu; then
    echo "==============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Ubuntu"
    echo "==============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Debian ; then
    echo "==============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Debian"
    echo "==============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Mint ; then
    echo "============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Mint"
    echo "============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Knoppix ; then
    echo "================================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Kanoppix"
    echo "================================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 else
    echo "OS NOT DETECTED, couldn't install package $PACKAGE"
    exit 1;
 fi

exit 0

उबंटू लिनक्स के लिए आउटपुट उदाहरण :

delivery@delivery-E5450$ sudo sh detect_os.sh
[sudo] password for delivery: 
NAME="Ubuntu"
===============================================
Installing packages python2.7 python-dev python-pip libssl-dev on Ubuntu
===============================================
Ign http://dl.google.com stable InRelease
Get:1 http://dl.google.com stable Release.gpg [916 B]                          
Get:2 http://dl.google.com stable Release [1.189 B] 
...            

5

यह सभी डिस्ट्रो पर उपयोग करने के लिए सुरक्षित होना चाहिए।

$ cat /etc/*release

यह कुछ इस तरह का उत्पादन करता है।

     DISTRIB_ID=LinuxMint
     DISTRIB_RELEASE=17
     DISTRIB_CODENAME=qiana
     DISTRIB_DESCRIPTION="Linux Mint 17 Qiana"
     NAME="Ubuntu"
     VERSION="14.04.1 LTS, Trusty Tahr"
     ID=ubuntu
     ID_LIKE=debian
     PRETTY_NAME="Ubuntu 14.04.1 LTS"
     VERSION_ID="14.04"
     HOME_URL="http://www.ubuntu.com/"
     SUPPORT_URL="http://help.ubuntu.com/"
     BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

अपनी इच्छानुसार चरों को निकालें / असाइन करें

नोट: कुछ सेटअप पर। इससे आपको कुछ त्रुटियाँ भी हो सकती हैं जिन्हें आप अनदेखा कर सकते हैं।

     cat: /etc/upstream-release: Is a directory

नोट: CentOS पर, यह देता है[user@host ~]$ cat /etc/*release CentOS release 6.4 (Final) CentOS release 6.4 (Final) CentOS release 6.4 (Final)
cfstras

हां, मैंने जो आउटपुट पोस्ट किया था वह मेरे लैपटॉप में से एक उदाहरण था, न कि स्थिर सामग्री जिसे आप हर जगह देखते हैं।
RJ

बस इतना जोड़ा कि किसी को नहीं लगेगा कि परिणाम हमेशा एक ही रूप में होता है :)
cfstras

1
+1 मैं स्क्रिप्ट की शुरुआत में सेट-ई का उपयोग कर रहा हूं (इस प्रकार यह समाधान doxer.org/linux-shell-centos-debian-ostype पर काम नहीं कर रहा है )। और अन्य समाधान विशेष रूप से CentOS नहीं हैं। लेकिन मुझे यह संदर्भ मिला जिसने इस उत्तर को साबित किया। unix.stackexchange.com/a/92212
gihanchanuka

4
मैक के लिए काम नहीं करता है:cat: /etc/*release: No such file or directory
eridal

3

इसे इस्तेमाल करे:

DISTRO=$(cat /etc/*-release | grep -w NAME | cut -d= -f2 | tr -d '"')
echo "Determined platform: $DISTRO"

MacOS पर मैंcat: /etc/*-release: No such file or directory
csexton

@ क्सेक्स्टन वास्तव में, मैं एक ही हो रहा हूं: zsh: no matches found: /etc/*release- यह केवल लिनक्स सिस्टम के लिए काम करेगा, मुझे लगता है ...
अलेक्जेंडर नेक्रासोव

यह उत्तर लिनक्स के लिए काम करता है, केवल, सुनिश्चित करने के लिए। लेकिन अन्य उत्तर केवल अन्य प्रणालियों के विरोध में लिनक्स का पता लगाने में सक्षम हैं। यह मूल खोज विशेष रूप से लिनक्स वितरण की खोज के लिए बिल्कुल भी मदद नहीं कर रही है क्योंकि फ्रीबीएसडी और डार्विन के बीच अंतर करना बहुत आवश्यक है।
थॉमस अर्बन

3

आप निम्न का उपयोग कर सकते हैं यदि क्लॉज और आवश्यकतानुसार इसका विस्तार करें:

if [ "${OSTYPE//[0-9.]/}" == "darwin" ]
then
    aminute_ago="-v-1M"
elif  [ "${OSTYPE//[0-9.]/}" == "linux-gnu" ]
then
    aminute_ago="-d \"1 minute ago\""
fi

2

मैंने कुछ लिनक्स डिस्ट्रोस के ऊपर दिए गए संदेशों की कोशिश की और निम्नलिखित पाया कि मेरे लिए सबसे अच्छा काम करना है। यह संक्षिप्त, संक्षिप्त सटीक उत्तर है जो बश के लिए विंडोज पर भी काम करता है।

OS=$(cat /etc/*release | grep ^NAME | tr -d 'NAME="') #$ echo $OS # Ubuntu

2
जबकि इस कोड स्निपेट का स्वागत है, और कुछ मदद प्रदान कर सकता है, यह हो जाएगा काफी सुधार हुआ है, तो यह उसका स्पष्टीकरण शामिल की कैसे और क्यों इस को हल करती है समस्या। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है! कृपया स्पष्टीकरण जोड़ने के लिए अपना उत्तर संपादित करें, और इस बात का संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
टॉबी स्पाइट

1
अधिकांश लिनक्स सिस्टमों के लिए अच्छा और अच्छा लगता है, लेकिन दुर्भाग्य से यह macOS पर एक त्रुटि होगी। शायद यह अधिक है "बैश से लिनक्स वितरण स्वाद का पता लगाएं
csexton

1
@csexton OS=$( ([[ -f /etc/*release ]] && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || echo "Unknown" )यह त्रुटियों को फेंकने के बिना काम करेगा।
कुजेको

वास्तव में, यहाँ एक सही तरीका हैOS=$( $(compgen -G "/etc/*release" > /dev/null) && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || $( echo "${OSTYPE//[0-9.]/}")
कुज़ेको

@ कुजको मैं दुर्भाग्य से अभी भी मैकओएस पर इसे चलाने में त्रुटियां प्राप्त करता हूं।
cxtxton

1

मैं अपना .bashrc और .bash_alias फ़ाइल साझा करने के लिए रखता हूं जिसे सभी प्लेटफ़ॉर्म एक्सेस कर सकते हैं। इस तरह से मैं अपने .bash_alias में समस्या पर विजय प्राप्त करता हूं:

if [[ -f (name of share)/.bash_alias_$(uname) ]]; then
    . (name of share)/.bash_alias_$(uname)
fi

और मेरे पास उदाहरण के लिए .bash_alias_Linux है:

alias ls='ls --color=auto'

इस तरह मैं प्लेटफ़ॉर्म विशिष्ट और पोर्टेबल कोड को अलग रखता हूं, आप .bashrc के लिए भी ऐसा ही कर सकते हैं


1

यह knownफ़ाइलों की एक गुच्छा की पहचान करने के लिए जाँच करता है यदि लिनक्स डिस्ट्रोयन डेबियन या उबुनू है, तो यह $OSTYPEचर को चूकता है ।

os='Uknown'
unamestr="${OSTYPE//[0-9.]/}"
os=$( compgen -G "/etc/*release" > /dev/null  && cat /etc/*release | grep ^NAME | tr -d 'NAME="'  ||  echo "$unamestr")

echo "$os"

-1

निम्नलिखित करने से ubuntu के लिए जाँच को सही ढंग से करने में मदद मिली:

if [[ "$OSTYPE" =~ ^linux ]]; then
    sudo apt-get install <some-package>
fi

4
अन्य लिनक्स सिस्टम के बारे में क्या जो उपयुक्त-उपयोग नहीं करते हैं?
विल्फ

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