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


39

मैं अपने मशीन पर चल रहे लिनक्स मशीन के नाम की जांच करने के आदेशों को जानता हूं। उदाहरण के लिए:

उबंटू

cat /etc/version

CentOS

cat /etc/issue

मैं टर्मिनल से आउटपुट कैसे प्राप्त कर सकता हूं और यह देखने के लिए तुलना करता हूं कि क्या यह UBUNTU या CENTOS है और निम्न कमांड निष्पादित करें?

apt-get install updates 

या

yum update

उबंटू 14.04

cat /etc/issue

2
उबंटू पूछने के लिए आपका स्वागत है। कृपया, क्या आप अपना कुछ समय पढ़ने के लिए लगा सकते हैं जब कोई मेरे प्रश्न का उत्तर दे तो मुझे क्या करना चाहिए?
सिल्वेन पिनेउ

जवाबों:


53

दुर्भाग्य से, वितरण नाम प्राप्त करने का कोई निश्चित तरीका, सरल तरीका नहीं है। अधिकांश बड़े डिस्ट्रोस एक प्रणाली की ओर बढ़ रहे हैं जहां वे /etc/os-releaseइस जानकारी को संग्रहीत करने के लिए उपयोग करते हैं। अधिकांश आधुनिक वितरण में lsb_releaseउपकरण भी शामिल हैं लेकिन ये हमेशा डिफ़ॉल्ट रूप से स्थापित नहीं होते हैं। तो, यहां कुछ दृष्टिकोण दिए गए हैं जिनका आप उपयोग कर सकते हैं:

  1. उपयोग /etc/os-release

    awk -F= '/^NAME/{print $2}' /etc/os-release
  2. lsb_releaseयदि उपलब्ध हो तो साधनों का उपयोग करें

    lsb_release -d | awk -F"\t" '{print $2}'
  3. एक अधिक जटिल स्क्रिप्ट का उपयोग करें जो कि अधिकांश विकृतियों के लिए काम करना चाहिए:

    # Determine OS platform
    UNAME=$(uname | tr "[:upper:]" "[:lower:]")
    # If Linux, try to determine specific distribution
    if [ "$UNAME" == "linux" ]; then
        # If available, use LSB to identify distribution
        if [ -f /etc/lsb-release -o -d /etc/lsb-release.d ]; then
            export DISTRO=$(lsb_release -i | cut -d: -f2 | sed s/'^\t'//)
        # Otherwise, use release info file
        else
            export DISTRO=$(ls -d /etc/[A-Za-z]*[_-][rv]e[lr]* | grep -v "lsb" | cut -d'/' -f3 | cut -d'-' -f1 | cut -d'_' -f1)
        fi
    fi
    # For everything else (or if above failed), just use generic identifier
    [ "$DISTRO" == "" ] && export DISTRO=$UNAME
    unset UNAME
    
  4. gccयदि स्थापित की संस्करण जानकारी पार्स करें :

    सेंटोस 5.x

    $ gcc --version
    gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
    Copyright (C) 2006 Free Software Foundation, Inc.
    

    सेंटोस 6.x

    $ gcc --version
    gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
    Copyright (C) 2010 Free Software Foundation, Inc.
    

    उबुन्टु 12.04

    $ gcc --version
    gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
    Copyright (C) 2011 Free Software Foundation, Inc.
    

    उबंटू 14.04

    $ gcc --version
    gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
    Copyright (C) 2013 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    

यह मूल रूप से यहाँ मेरे प्रश्न के @ स्लम के शानदार उत्तर से सीधे कॉपी किया गया है


"दुर्भाग्य से, वितरण नाम प्राप्त करने का कोई निश्चित तरीका, सरल तरीका नहीं है।" <— यह बिल्कुल ऐसा नहीं है। उदाहरण के लिए, सिल्वेन पिनेऊ ने पायथन के लिए वर्तमान प्लेटफ़ॉर्म प्रकार को विश्वसनीय रूप से उद्धृत करते हुए एक मामूली वन-लाइनर का प्रदर्शन किया - जो कि अधिकांश प्लेटफार्मों (उबंटू सहित) पर प्रीइंस्टॉल्ड आता है। शेल स्क्रिप्ट को कभी भी इस उत्तर में लागू किए गए सॉर्ट के निम्न-स्तरीय, गैर-पोर्टेबल परीक्षणों के साथ प्लेटफॉर्म मेटाडेटा को मैन्युअल रूप से क्वेरी करने का प्रयास नहीं करना चाहिए ।
सेसिल करी

डिफ़ॉल्ट रूप से डेबियन में गॉव स्थापित नहीं है।
विले लाटिला

@VilleLaitila मुझे डर है कि यहाँ प्रासंगिक नहीं है क्योंकि यह साइट केवल उबंटू के बारे में है। लेकिन यहाँ कुछ भी विशिष्ट नहीं है, इसलिए awkया कुछ mawkअन्य कार्यान्वयन बस के रूप में अच्छी तरह से काम करेंगे।
terdon

और भी विशिष्ट उपयोग lsb_release:lsb_release -d | awk -F"\t" '{print $2}' | awk -F " " '{print $1}'
NerdOfCode

@NerdOfCode यदि आप केवल रिलीज़ नंबर चाहते हैं, तो lsb_release -d | awk '{print $3}'या grep -oP 'VERSION="\K\S+' /etc/os-release, डबल पाइप को जागने के लिए कोई ज़रूरत नहीं है।
terdon

25

आपको इस तरह के कार्य करने के लिए बैश करने की आवश्यकता नहीं है, और मैं सुझाव दूंगा कि एक उच्च-स्तरीय दृष्टिकोण का उपयोग करके फ़ाइलों से निपटने से बचें /etc/versionऔर /etc/issue(मेरे पास 13.10 पर / etc / version नहीं है)।

इसलिए मेरी सलाह है कि इस आदेश का उपयोग करें:

python -mplatform | grep -qi Ubuntu && sudo apt-get update || sudo yum update

अजगर मंच मॉड्यूल दोनों सिस्टम पर काम करेंगे, आदेश के बाकी अगर उबंटू अजगर से लौट आए और चलाया जाता है की जाँच करेगा apt-getऔर को yum


मदद -iकरने के लिए जोड़ grepसकते हैं।
coanor

8

यहाँ एक सरल उत्तर है कि मैं उबंटू / सेंटोस / आरएचईएल के सभी संस्करणों में फाइलों की मात्र उपस्थिति से काम करता हूँ (यदि कोई रैंडमली ड्रॉपिंग कर रहा है तो निश्चित रूप से विफल हो सकता है / आदि / आपके उबंटू बॉक्स, आदि पर रेडहैट-रिलीज़):

if [ -f /etc/redhat-release ]; then
  yum update
fi

if [ -f /etc/lsb-release ]; then
  apt-get update
fi

मेरे ubuntu पर कोई / etc /
lsb-

3
मैं -1 में नहीं जा रहा हूं, लेकिन कम से कम एक मामले में यह जवाब सही नहीं है: /etc/lsb-releaseक्लाउडलिनक्स (सेंटोस) 6.8 पर मौजूद है, इसलिए यह दोनों yumऔर वापस आ जाएगा apt-get
धुपिन

5

इन कार्यों के लिए बावर्ची का उपयोग करें ;-)

बावर्ची में, आप platform?विधि का उपयोग कर सकते हैं :

if platform?("redhat", "centos", "fedora")
  # Code for only Red Hat Linux family systems.
end

या:

if platform?("ubuntu")
  # Code for only Ubuntu systems
end

या:

if platform?("ubuntu")
  # Do Ubuntu things
end

या:

if platform?("freebsd", "openbsd")
  # Do BSD things
end

1
जबकि प्रमाण्य से बेहतर निम्न स्तर के खोल केंद्रित नाजुक गैर समाधान (जैसे, lsb_release, /etc/os-release), इस समाधान बावर्ची की आवश्यकता होती है के विशिष्ट नुकसान है - एक दिग्गज इंफ्रास्ट्रक्चर संहिता (आईएसी) के रूप में ढांचे नहीं सबसे प्लेटफार्मों पर डिफ़ॉल्ट और के उपयोग की आवश्यकता द्वारा स्थापित अपनी स्वयं की डोमेन-विशिष्ट भाषा (DSL)। संक्षेप में, अधिकांश उपयोगकर्ताओं को शायद अभी करना चाहते हैं अजगर को स्थगित , जो है शेल पटकथा लेखन के साथ अच्छी तरह से (उबंटू सहित) सबसे प्लेटफार्मों और इंटरफेस पर डिफ़ॉल्ट रूप से स्थापित।
सेसिल करी

5

कर्नेल नाम में Ubuntu के लिए जाँच करें:

if [  -n "$(uname -a | grep Ubuntu)" ]; then
    sudo apt-get update && sudo apt-get upgrade 
else
    yum update
fi  

4
 apt-get -v &> /dev/null && apt-get update
 which yum &> /dev/null && yum update

यदि केवल दो डिस्ट्रो हैं, तो आप इसे छोटा कर सकते हैं:

apt-get -v &> /dev/null && apt-get update || yum update

किसी तरह yum -vसेंटोस में गैर-शून्य लौटें इसलिए whichइसके बजाय उपयोग करें ,
निश्चित रूप से आपको परिदृश्य पर विचार करना चाहिए अगर कोई whichस्थापित नहीं है।


2

निम्नलिखित स्क्रिप्ट को यह बताना चाहिए कि क्या यह उबंटू है। यदि यह नहीं है और आपके पास एकमात्र अन्य विकल्प CentOS है, तो आपको इसे एक elseखंड में रखना चाहिए :

dist=`grep DISTRIB_ID /etc/*-release | awk -F '=' '{print $2}'`

if [ "$dist" == "Ubuntu" ]; then
  echo "ubuntu"
else
  echo "not ubuntu"
fi

1
यह संभवतः lsb_releaseटूल का उपयोग करके सरल किया जा सकता है , जिसे उसी फ़ाइलों को पढ़ना चाहिए। या lsb_release -iतो इन मामलों में रिपोर्ट । Distributor ID: UbuntuDistributor ID: CentOS
क्रोनाइटिस

@ सिंक्राइटिस: हाँ, यकीन है कि यह हो सकता है
jobin

मुझे नहीं लगता कि यह डिफ़ॉल्ट रूप से सेंटोस पर उपलब्ध है
सिल्वेन पिनेउ

1

/etc/os-releaseएक उप शेल में निष्पादित करें और इसके मूल्य को प्रतिध्वनित करें:

if [ "$(. /etc/os-release; echo $NAME)" = "Ubuntu" ]; then
  apt-get install updates 
else
  yum update
fi

0

मैं अजगर का उपयोग करूंगा

if ! python -c "exec(\"import platform\nexit ('centos' not in platform.linux_distribution()[0].lower())\")" ; then
   echo "It is not CentOS distribution, ignoring CentOS setup"
   exit 0
fi

0

CentOS, Ubuntu और Debian में इस कमांड का उपयोग करना: grep "^NAME=" /etc/os-release |cut -d "=" -f 2 | sed -e 's/^"//' -e 's/"$//'

डेबियन में इसकी पैदावार होती है Debian GNU/Linux, उबंटू में इसकी पैदावार होती है Ubuntuऔर सेंटोस में इसकी पैदावार होती है CentOS Linux

Gawk के बजाय grep, cut और sed का उपयोग करने का लाभ स्पष्ट है: Debian में डिफ़ॉल्ट रूप से gawk स्थापित नहीं है, इसलिए आप यादृच्छिक Debian बॉक्स पर इस पर भरोसा नहीं कर सकते।

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