วิธีการเขียนสคริปต์ที่กำหนดชื่อ distro ได้อย่างมีประสิทธิภาพ?


13

ฉันเห็นโพสต์นี้ในหลาย ๆ วิธีเพื่อค้นหาว่ามีการติดตั้ง distro ใดดังนั้นฉันจึงพยายามเขียนสคริปต์ที่ลองใช้งานทั้งหมด คำสั่งที่เป็นไปได้รวมถึง:

$ 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"
}

ใครช่วยฉันรวมวิธีอื่นทั้งหมดเพื่อให้ได้ชื่อของ distro หรือไม่

คำตอบ:


13

การแจกจ่ายแต่ละครั้ง (แม้จะมีความพยายาม lsb) ใช้หรืออาจใช้ (หรืออาจขาด) ไฟล์ที่แตกต่างใน / etc / เพื่อประกาศชื่อและรุ่นของมันคืออะไร

คุณควรเพิ่มเงื่อนไขในสคริปต์สำหรับแต่ละรายการ โปรดคำนึงถึงด้วยว่า distros บางอันได้มาจากไฟล์หลักอื่น ๆ และอาจปรับเปลี่ยนไฟล์เวอร์ชันของพวกเขาหรือไม่ก็ได้

หากคุณไม่ต้องการคิดค้นล้อใหม่คุณสามารถใช้คนอื่นทำงานเพื่อให้ได้สิ่งที่คุณต้องการ ตัวอย่างเช่นใน python ในแพลตฟอร์มโมดูลมีวิธีการเดาการแจกแจง:

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 ทำงานร่วมกับ distros บางตัว แต่ไม่ใช่กับ linux ทั้งหมดภายใต้ "ArchLinux, Slackware & Derivates" นี่ใช้ไม่ได้ผลที่ได้คือ "blank"
inukaze

1

นี่เป็นบิตของวิธีการ "เดรัจฉาน - แรง" ในการทำสิ่งต่าง ๆ ให้สำเร็จ แต่มันก็รวดเร็วและควรใช้การทุบตีเพื่อทำงานกับ distro ส่วนใหญ่

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

หากคุณไม่กลัวการพึ่งพาเพิ่มเติมคุณสามารถใช้facterเพื่อสิ่งนั้นได้ มันให้ข้อมูลเกี่ยวกับชื่อ distro และเวอร์ชั่นแม้ไม่ได้ติดตั้ง lsb_release

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.