如何编写可有效确定发行版名称的脚本?


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

有人可以帮助我合并其他所有方式来获得发行版的名称吗?

Answers:


13

每个发行版(尽管有lsb的努力)都使用或可能使用(甚至可能缺少)/ etc /中的一个不同文件来声明其名称和版本。

您可以在脚本中为每个条件添加一个条件。还应考虑到某些发行版是从其他主要发行版派生的,可能会也可能不会修改其版本文件。

如果您不想重新发明轮子,可以使用其他人的工作来实现您想要的。例如,在模块平台的 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

Linux标准基础规定了一个命令:

lsb_release -si

它并不总是默认安装的一部分,因此,如果您希望脚本在每个系统上都可以使用,则必须退而求其次。


lsb_release -si适用于某些发行版,但不适用于所有Linux,在“ ArchLinux,Slackware和衍生产品”下,此功能
无效

1

这是完成工作的一种“蛮力”方法,但是它是快速的,并且应该使用bash在大多数发行版的工具上工作

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了点。即使没有安装lsb_release,它也提供有关发行版名称和版本的信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.