当前位置: 首页>>技术教程>>正文


如何借助Bash脚本知道运行的平台是Ubuntu还是CentOS?

, ,

问题描述

我知道用于检查在我的机器上运行的Linux机器名称的命令。例如:

Ubuntu

cat /etc/version

CentOS

cat /etc/issue

如何从终端获取输出并进行比较以查看它是UBUNTU还是CENTOS,然后执行以下命令?

apt-get install updates 

要么

yum update

Ubuntu 14.04

cat /etc/issue

最佳方案

不幸的是,没有确定版本的简单方法。大多数主要发行版are moving towards是一个使用/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的版本信息(如果已安装):

    CentOS 5.x

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

    CentOS 6.x版

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

    Ubuntu 12.04

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

    Ubuntu 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.
    

这基本上已从@slm的出色answer直接复制到我的问题here中。

次佳方案

您不需要bash即可执行此任务,我建议您使用high-level方法来避免处理/etc/version/etc/issue之类的文件(我在13.10上没有/etc /version)。

所以我的建议是改用以下命令:

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

python platform模块将在两个系统上都可以工作,其余命令将检查python是否返回Ubuntu并运行apt-get否则运行yum

第三种方案

这是一个简单的答案,我发现仅凭文件的存在即可在所有版本的Ubuntu /CentOS /RHEL上运行(当然,如果有人在您的Ubuntu盒子上随机放置/etc /redhat-release等,则不是故障保护):

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

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

第四种方案

检查内核名称中的Ubuntu:

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

第五种方案

使用Chef完成这些任务。

在Chef中,可以使用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

第六种方案

 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以某种方式在CentOS中返回非零值,因此请使用which代替,当然,如果没有安装which,则应该考虑这种情况。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/9546.html,未经允许,请勿转载。