Jak napisać skrypt, który skutecznie określa nazwę dystrybucji?

13

Widziałem ten post na różne sposoby, aby dowiedzieć się, która dystrybucja jest zainstalowana, więc próbuję napisać skrypt, który wypróbuje je wszystkie. Możliwe polecenia obejmują:

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

Próbowałem napisać coś takiego (normalnie mówię po hiszpańsku, więc jest po hiszpańsku):

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

Czy ktoś może mi pomóc w uwzględnieniu wszystkich innych sposobów uzyskania nazwy dystrybucji?

inukaze
źródło

Odpowiedzi:

13

Każda dystrybucja (pomimo wysiłków lsb) używa lub może używać (a nawet może go nie mieć) innego pliku w / etc /, aby zadeklarować, jaka jest jego nazwa i wersja.

Możesz dodać warunek do skryptu dla każdego z nich. Weź również pod uwagę, że niektóre dystrybucje pochodzą od innych głównych i mogą, ale nie muszą, dostosowywać swoich plików wersji.

Jeśli nie chcesz od nowa wymyślać koła, możesz wykorzystać pracę innych ludzi, aby osiągnąć to, czego szukasz. Na przykład w Pythonie na platformie modułowej istnieje metoda odgadywania dystrybucji:

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.

na przykład:

In [1]: import platform

In [2]: platform.linux_distribution()
Out[2]: ('Ubuntu', '11.10', 'oneiric')
hmontoliu
źródło
3

Linux Standard Base określa polecenie na to:

lsb_release -si

Nie zawsze jest to część domyślnej instalacji, więc jeśli chcesz, aby Twój skrypt działał na każdym systemie, musisz wrócić do trasy typu „zgadnij”.

Gilles „SO- przestań być zły”
źródło
lsb_release -si działa z niektórymi dystrybucjami, ale nie ze wszystkimi linuxami, pod „ArchLinux, Slackware & Derivates” to nie działa, wynik jest „pusty”
inukaze
1

Jest to trochę „brutalna siła” metody osiągania celów, ale jest szybka i powinna, używając bash, działać na większości dystrybucji

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
frogstarr78
źródło
1

Jeśli nie boisz się dodatkowych zależności, możesz użyć do tego faktora . Podaje informacje o nazwie i wersji dystrybucji nawet bez zainstalowanego lsb_release.

RVS
źródło