Bashスクリプトを使用して、実行中のプラットフォームがUbuntuかCentOSかを知る方法は?


39

私のマシンで実行されているLinuxマシンの名前を確認するコマンドを知っています。例えば:

Ubuntu

cat /etc/version

CentOS

cat /etc/issue

ターミナルから出力を取得し、UBUNTUまたはCENTOSであるかどうかを確認して、次のコマンドを実行するにはどうすればよいですか?

apt-get install updates 

または

yum update

Ubuntu 14.04

cat /etc/issue

2
Ask Ubuntuへようこそ。、あなたが読むためにあなたの時間のいくつかを置くことができるしてください誰かが私の質問に答えるとき、私は何をすべき?
シルヴァンピノー

回答:


53

残念ながら、ディストリビューション名を取得する簡単で確実な方法はありません。ほとんどの主要なディストリビューション/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の素晴らしい回答から直接コピーされています


「残念ながら、ディストリビューション名を取得する確実な簡単な方法はありません。」<— これはまったく当てはまりません。 例えば、Sylvain Pineauは、ほとんどのプラットフォーム(Ubuntuを含む)にプリインストールされているPythonを延期することにより、現在のプラットフォームタイプを確実に照会する些細なワンライナーを展示しました。シェルスクリプトは、この回答に実装されている種類の低レベルで移植性のないテストで、プラットフォームメタデータを手動でクエリしようとしないでください。
セシルカレー

GawkはデフォルトではDebianにインストールされていません。
ヴィルLaitila

@VilleLaitilaこのサイトはUbuntuのみに関するものなので、ここでは関係ないのではないかと心配しています。しかし、ここにはgawk固有のものは何もないのでawkmawk他の実装も同様に機能します。
テルドン

さらに具体的な使用lsb_releaselsb_release -d | awk -F"\t" '{print $2}' | awk -F " " '{print $1}'
NerdOfCode

@NerdOfCodeは、リリース番号が必要な場合、do lsb_release -d | awk '{print $3}'またはgrep -oP 'VERSION="\K\S+' /etc/os-release、awkへの二重パイプは不要です。
テルドン

25

あなたは、このようなタスクを行うためにはbashを必要としない、と私のようなファイルを扱う避けるために、高レベルのアプローチを使用してお勧めしたい/etc/version/etc/issue(私は13.10の/ etc /バージョンを持っていません)。

したがって、代わりにこのコマンドを使用することをお勧めします。

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

python プラットフォームモジュールは両方のシステムで動作しapt-getますyum。残りのコマンドは、Ubuntuがpythonから返されたかどうかを確認し、else を実行します。


に追加-iするgrepことができます。
-coanor

8

これは、ファイルが存在するだけで、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には/ etc / lsb-releaseはありません
-noonex

3
:私は-1につもりはないが、この答えは、少なくとも一つのケースで正しく行われていません/etc/lsb-release、それは両方を返しますので、6.8をCloudLinux(CentOSの)上に存在するyumapt-get
dhaupin

5

これらのタスクに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

1
明らかに優れながら、低レベルシェル中心脆い非溶液(例えば、lsb_release/etc/os-release)、この溶液は、シェフを必要とする明確な欠点を有する-コード(IAC)フレームワークとしてヘビーインフラではないほとんどのプラットフォームにデフォルトでインストールの使用を必要とします独自のドメイン固有言語(DSL)。要するに、ほとんどのユーザーは、おそらくしたいのPythonに延期するされるシェルスクリプトでも(Ubuntuのを含む)ほとんどのプラットフォームにデフォルトでインストールおよびインタフェース。
セシルカレー

5

カーネル名でUbuntuを確認します。

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

4
 apt-get -v &> /dev/null && apt-get update
 which yum &> /dev/null && yum update

ディストリビューションが2つしかない場合は、短くすることができます。

apt-get -v &> /dev/null && apt-get update || yum update

yum -vCentOSで何らかの方法でゼロ以外を返すので、which代わりに使用します。
もちろん、whichインストールされていない場合はシナリオを検討する必要があります。


2

次のスクリプトは、Ubuntuかどうかを判断する必要があります。そうでなく、あなたが持っている唯一の他のオプションがCentOSである場合、あなたはelse句にそれを持つべきです:

dist=`grep DISTRIB_ID /etc/*-release | awk -F '=' '{print $2}'`

if [ "$dist" == "Ubuntu" ]; then
  echo "ubuntu"
else
  echo "not ubuntu"
fi

1
これはおそらくlsb_release同じファイルを読み取るツールを使用して簡素化できます。またはこれらの場合にlsb_release -i報告します。Distributor ID: UbuntuDistributor ID: CentOS
クロニチス14年

@chronitis:はい、確かに可能です
jobin

私はそれがCentOSににデフォルトで使用可能だとは思わない
シルヴァン・ピノー

1

サブシェル/etc/os-releaseで実行し、その値をエコーし​​ます。

if [ "$(. /etc/os-release; echo $NAME)" = "Ubuntu" ]; then
  apt-get install updates 
else
  yum update
fi

0

私はPythonを使用します

if ! python -c "exec(\"import platform\nexit ('centos' not in platform.linux_distribution()[0].lower())\")" ; then
   echo "It is not CentOS distribution, ignoring CentOS setup"
   exit 0
fi

0

このコマンドを使用すると、CentOS、Ubuntu、Debianで機能します。 grep "^NAME=" /etc/os-release |cut -d "=" -f 2 | sed -e 's/^"//' -e 's/"$//'

Debianではそれが得られDebian GNU/Linux、Ubuntuではそれが得られUbuntu、CentOSではそれが得られCentOS Linuxます。

gawkの代わりにgrep、cut、sedを使用する利点は明らかです。Debianにはデフォルトでgawkがインストールされていないため、ランダムなDebianボックスに依存することはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.