एक स्क्रिप्ट कैसे लिखें जो प्रभावी रूप से डिस्ट्रो नाम का निर्धारण करती है?


13

मैंने इस पोस्ट को सभी अलग-अलग तरीकों से देखा कि यह पता लगाने के लिए कि डिस्ट्रो क्या स्थापित है, इसलिए मैं एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो उन सभी की कोशिश करता है। संभावित आदेशों में शामिल हैं:

$ cat /etc/lsb-release 
$ cat /etc/issue 
$ dmesg | head -1
$ cat /proc/version 
$ cat /etc/slackware-version 
$ cat/etc/debian-verion 

मैंने ऐसा कुछ लिखने की कोशिश की (मैं सामान्य रूप से स्पेनिश बोलता हूं, इसलिए यह स्पेनिश में है):

function Nombre_SO()
{

    DistroName="Linux"
    if [ $DistroName = Linux ] ;
    then

# Debian
    debian=`cat /etc/debian_version | cut -d " " -f01 | tr '[:upper:]' '[:lower:]'`
    if [ "$debian" = "debian" || "squeeze/sid" || "lenny" ]; 
        then
        DistroName="debian"
        else
        echo "Esto no es debian"
    fi

# Slackware
    slackware=`cat /etc/slackware-version | cut -d " " -f01` | tr '[:upper:]' '[:lower:]'`
    if [ "$slackware" = "slackware" || "slackware-x86_64" ];
    then
        DistroName="slackware" 
    else
    echo "Esto no es Slackware"
}

क्या कोई मुझे डिस्ट्रो का नाम पाने के लिए अन्य सभी तरीकों को शामिल करने में मदद कर सकता है?

जवाबों:


13

प्रत्येक वितरण (lsb प्रयासों के बावजूद) का उपयोग या (या यहां तक ​​कि इसकी कमी हो सकती है) एक अलग फ़ाइल / etc / में यह घोषित करने के लिए कि उसका नाम और संस्करण क्या है।

आप प्रत्येक के लिए अपनी स्क्रिप्ट में एक शर्त जोड़ते हैं। यह भी ध्यान में रखें कि कुछ डिस्ट्रोस अन्य प्रमुख लोगों से प्राप्त होते हैं और उनकी संस्करण फ़ाइलों को अनुकूलित कर सकते हैं या नहीं भी कर सकते हैं।

यदि आप उस पहिये को सुदृढ़ नहीं करना चाहते हैं, तो आप अन्य लोगों के काम का उपयोग कर सकते हैं जो आप देख रहे हैं। उदाहरण के लिए अजगर मंच में अजगर में वितरण का अनुमान लगाने की एक विधि है:

Help on function linux_distribution in module platform:

linux_distribution(distname='', version='', id='', supported_dists=('SuSE', 'debian', 'fedora', 'redhat', 'centos', 'mandrake', 'mandriva', 'rocks', 'slackware', 'yellowdog', 'gentoo', 'UnitedLinux', 'turbolinux'), full_distribution_name=1)
    Tries to determine the name of the Linux OS distribution name.

    The function first looks for a distribution release file in
    /etc and then reverts to _dist_try_harder() in case no
    suitable files are found.

    supported_dists may be given to define the set of Linux
    distributions to look for. It defaults to a list of currently
    supported Linux distributions identified by their release file
    name.

    If full_distribution_name is true (default), the full
    distribution read from the OS is returned. Otherwise the short
    name taken from supported_dists is used.

    Returns a tuple (distname,version,id) which default to the
    args given as parameters.

उदाहरण के लिए:

In [1]: import platform

In [2]: platform.linux_distribution()
Out[2]: ('Ubuntu', '11.10', 'oneiric')

3

लिनक्स स्टैंडर्ड बेस कि के लिए एक कमांड निर्दिष्ट करता है:

lsb_release -si

यह हमेशा डिफॉल्ट इंस्टॉलेशन का हिस्सा नहीं होता है, इसलिए यदि आप चाहते हैं कि आपकी स्क्रिप्ट हर सिस्टम पर काम करे, तो आपको लुक-एंड-एस्टीमेट मार्ग पर वापस जाना होगा।


lsb_release -si कुछ डिस्ट्रोस के साथ काम करता है, लेकिन सभी आर्क के साथ नहीं, "आर्चलिनक्स, स्लैकवेयर एंड डेरिवेट्स" के तहत यह काम नहीं करता है, परिणाम "रिक्त" है
14

1

यह चीजों को पूरा करने का एक "जानवर-बल" विधि का एक सा है, लेकिन यह त्वरित और चाहिए, का उपयोग करते हुए, अपने डिस्ट्रो के काम पर

ver=$(cat /etc/*{issues,release,version} 2> /dev/null)
if [[ $(echo $ver | grep DISTRIB_ID) ]]; then
    lsb_release -si
else
    echo $ver | cut -d ' ' -f 1 | sort -u | head -1
fi

1

यदि आप अतिरिक्त निर्भरता से डरते नहीं हैं, तो आप उसके लिए फैक्टर का उपयोग कर सकते हैं । यह lsb_release स्थापित किए बिना भी डिस्ट्रो नाम और संस्करण के बारे में जानकारी देता है।

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