単純なシェルスクリプトでディストリビューション名とバージョン番号を取得するにはどうすればよいですか?


191

UbuntuとCentOSディストリビューションで実行できるシンプルなbashスクリプトに取り組んでおり(DebianとFedora / RHELのサポートがあればプラスになります)、スクリプトが実行しているディストリビューションの名前とバージョンを知る必要があります(リポジトリの作成など、特定のアクションをトリガーするため)。これまでのところ、これは次のとおりです。

OS=$(awk '/DISTRIB_ID=/' /etc/*-release | sed 's/DISTRIB_ID=//' | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')
VERSION=$(awk '/DISTRIB_RELEASE=/' /etc/*-release | sed 's/DISTRIB_RELEASE=//' | sed 's/[.]0/./')

if [ -z "$OS" ]; then
    OS=$(awk '{print $1}' /etc/*-release | tr '[:upper:]' '[:lower:]')
fi

if [ -z "$VERSION" ]; then
    VERSION=$(awk '{print $3}' /etc/*-release)
fi

echo $OS
echo $ARCH
echo $VERSION

これ、リリース名として戻るubuntucentos(他の人は試したことがない)動作しているようです。しかし、私はこれを見つけるより簡単で信頼性の高い方法がなければならないと感じています-それは本当ですか?

RedHatでは機能しません。/ etc / redhat-releaseの内容:Redhat Linux Entrepriseリリース5.5

だから、バージョンは3番目の単語ではありません、あなたが使う方が良いでしょう:

OS_MAJOR_VERSION=`sed -rn 's/.*([0-9])\.[0-9].*/\1/p' /etc/redhat-release`
OS_MINOR_VERSION=`sed -rn 's/.*[0-9].([0-9]).*/\1/p' /etc/redhat-release`
echo "RedHat/CentOS $OS_MAJOR_VERSION.$OS_MINOR_VERSION"

本当に+-release動作しますか?事実上/etc/lsb-release、それがになると仮定しているので、おそらくそれを単に呼び出してください。
ミケル

@Mikel:コメントのフォーマットを回避するために置き換え*まし+etc/*-release
アリックスアクセル

8
フォーマットを正しくするために構文エラーを導入しないでください。また、プレビューでのみフォーマットが間違っているため、最終ビューではタグから構文が選択されます。
ジル

このfeに誰も言及せずuname -rv | grep -i "name_of_distro"、終了コードを使用するのはなぜですか?
逃亡者

回答:


182

取得OSVER、最新の標準はのよう/etc/os-releaseです。その前に、とがlsb_releaseありました/etc/lsb-release。その前に、ディストリビューションごとに異なるファイルを探す必要がありました。

ここに私が提案するものがあります

if [ -f /etc/os-release ]; then
    # freedesktop.org and systemd
    . /etc/os-release
    OS=$NAME
    VER=$VERSION_ID
elif type lsb_release >/dev/null 2>&1; then
    # linuxbase.org
    OS=$(lsb_release -si)
    VER=$(lsb_release -sr)
elif [ -f /etc/lsb-release ]; then
    # For some versions of Debian/Ubuntu without lsb_release command
    . /etc/lsb-release
    OS=$DISTRIB_ID
    VER=$DISTRIB_RELEASE
elif [ -f /etc/debian_version ]; then
    # Older Debian/Ubuntu/etc.
    OS=Debian
    VER=$(cat /etc/debian_version)
elif [ -f /etc/SuSe-release ]; then
    # Older SuSE/etc.
    ...
elif [ -f /etc/redhat-release ]; then
    # Older Red Hat, CentOS, etc.
    ...
else
    # Fall back to uname, e.g. "Linux <version>", also works for BSD, etc.
    OS=$(uname -s)
    VER=$(uname -r)
fi

uname取得するのARCHが最善の方法だと思います。しかし、あなたが与えた例は明らかにIntelシステムのみを扱います。次のBITSように呼び出します。

case $(uname -m) in
x86_64)
    BITS=64
    ;;
i*86)
    BITS=32
    ;;
*)
    BITS=?
    ;;
esac

または変更するARCHより一般的な、まだ明確なバージョンであることを:x86およびx64または類似:

case $(uname -m) in
x86_64)
    ARCH=x64  # or AMD64 or Intel64 or whatever
    ;;
i*86)
    ARCH=x86  # or IA32 or Intel32 or whatever
    ;;
*)
    # leave ARCH as-is
    ;;
esac

もちろん、それはあなた次第です。


2
lsb_releaseを確認し、利用可能な場合はそれを使用しますが、どこでも利用できるわけではありません。例えば、それはデフォルトではFedora 14のインストールではありません
スティーヴン・D

本当に?-andでスペルを試してみました_か?たぶんそれは/lib/lsbそのような場所にあります。rpm -qa "lsb*"印刷するもの
ミケル

1
rpm -qa "lsb*何も印刷しません。それによるyum provides */lsb_releaseと、redhat-lsbと呼ばれるパッケージに含まれており、デフォルトではインストールされていないと思います。ただし、私はFedoraの専門家ではありません。これらは私が持っているランダムなFedora VMの結果であり、非常に間違っている可能性があります。
スティーブンD

3
Fedora 14をVMにインストールしたばかりlsb-releaseで、あなたが言ったようにがありません。
ミケル

5
使用しないでください$OS$VERSIONなど-慣例により、我々は、環境変数(PAGER、EDITOR、SHELL、...)と内部シェル変数を大文字(BASH_VERSION、RANDOM、...)。他のすべての変数名には、少なくとも1つの小文字を含める必要があります。この規則により、環境変数および内部変数が誤ってオーバーライドされるのを防ぎます。
クリスダウン

58

私はこれを最初のステップとして使います:

ls /etc/*release

Gentoo、RedHat、Arch、およびSuSEには、たとえばというファイルがあります/etc/gentoo-release。人気があるようです。release -filesについてはこのサイトを確認してください。

DebianとUbuntu /etc/lsb-releaseにはリリース情報も含まれている必要があり、前のコマンドで表示されます。

もう1つ簡単な方法ですuname -rv。インストールされているカーネルがストックディストリビューションカーネルである場合、通常はそこに名前が見つかることがあります。


Debianでは、それがuname -a
シェパン

2
uname -rvしかし、情報が含まれていませんか?uname -aここでは無関係なプロセッサのタイプやホスト名などを出力します。(ただし、カーネルリリース(-r)とバージョン(-v)の両方が必要です。すべてのディストリビューションが同じことを行うわけではありません)
Mat

uname -rはDebian 6で2.6.32-5-686-bigmemuname -vは与える。uname -a OTOHは与える。#1 SMP Tue Mar 8 22:14:55 UTC 2011Linux debian 2.6.32-5-686-bigmem #1 SMP Tue Mar 8 22:14:55 UTC 2011 i686 GNU/Linux
シェパン

の2番目の部分uname -a-n、nodename == hostnameです。だからuname、Debianでは面白くないと思います。考えてみると、RedHatでこれが非常に役立つかどうかはわかりません。
マット

ああ、わかった。したがって、運が良ければ、ホスト名をデフォルトとして設定しますdebian
シェパン

36

lsb_release -a。Debianで動作し、Ubuntuを推測しますが、残りについてはわかりません。通常、LSB(Linux Standard Base)関連であるため、すべてのGNU / Linuxディストリビューションに存在するはずです。


3
Gentooにはデフォルトではインストールされていません。これは、Fedoraには、デフォルトではありませんでしたどちらかのいくつかの時点で(おそらくけれども、今ある)
マット

2
これは、Debian squeeze、Fedora 14、およびOpenSUSE 11.3で機能しました。DebianおよびSUSEでは、lsb_releaseを含むパッケージはlsb-releaseで、Fedoraではredhat-lsbでした。DebianとSUSEにはすでにインストールされていますが、Fedoraにはインストールされていません。これがこれまでのベストアンサーだと思います。+1。
ファヒムミタ

3
lsb_releaseはCentOS 6の最小インストールの一部ではありません。
コーダー

1
lsb_release -aは、Raspberry with RaspbianDebian 7.1派生)で「-bash:lsb_release:command not found」を返します。
ピーターモーテンセン14年

lsb_release -aはRed Hat Enterprise Linux Serverリリース6.6(サンティアゴ)で動作します
-jwilleke

21

1行、フォールバック、1行の出力、エラーなし。

lsb_release -ds 2>/dev/null || cat /etc/*release 2>/dev/null | head -n1 || uname -om

美しい、ありがとう。これはまだMac OS Xでは機能しませんが、UbuntuおよびCentOS(私が手に入れている3つ)では正常に機能します。
ワイルドカード

2
ブリリアント!なぜそのような素晴らしい答えが上にないのですか?
ネオ


9
  1. lsb- * はインストールされていない/ベースCentOSまたはDebianシステムに存在しない
  2. / proc / * はOSXに存在しません

JavaScript開発者からヒントをもらいましょう。バージョンをテストするのではなく、機能をテストします。きれいではありませんが、動作します。必要に応じて展開します。

function os_type
{
case `uname` in
  Linux )
     LINUX=1
     which yum && { echo centos; return; }
     which zypper && { echo opensuse; return; }
     which apt-get && { echo debian; return; }
     ;;
  Darwin )
     DARWIN=1
     ;;
  * )
     # Handle AmgiaOS, CPM, and modified cable modems here.
     ;;
esac
}  

6
Yumは、Red Hat、Scientific Linux、またはFedoraになります。Debianを模倣したFedoraのaptコマンドがありました。等々。CentOSはRed Hat 4からFedora 18までの幅広いサポートシステムを提供するため、yumを使用してあらゆるものを分類するだけです。これは、約8年間のLinuxの歴史です。<foo>がサポートされているかどうかを知る必要がある場合は、(信頼できない)配布識別に基づいて推測するのではなく、特に<foo>を確認してください!確かに、それはautotoolsの同類の何かにつながりますが、それは仕方がありません(Unixの戦争が終わったことを$ DEITYに感謝するだけです)。
フォンブランド

@vonbrandは確かに、あなたの言うとおりです。サブフレーバーを区別しようとはしません。そして、(うまくいけば)私がチェックインする順序は、ほとんどのトリッキーな状況(apt-getがインストールされたRHEL)を削除しますが、私は多くの研究をしませんでした。RHELでapt-getをインストールでき、Ubuntuユーザーがyumを持っている場合は...うまくいきません。
Orwellophile

6

成功の可能性が最も高い順に、これらは次のとおりです。

cat /etc/*version
cat /proc/version #linprocfs/version for FreeBSD when "linux" enabled
cat /etc/*release
uname -rv

ほとんどの場合(AFAIK):Debian、Ubuntu、Slackware、Suse、Redhat、Gentoo、* BSDなど。


cat /etc/*version(少なくとも6.4上)のCentOS上で(そのようなファイルが存在しない)動作しません
OM-NOM-NOM

コンテナーでコマンドを実行すると、/ proc / versionには、コンテナー配布バージョンではなく、HOST配布バージョンが含まれます。
デレクソン

5

最近のほとんどのLinux OSシステムでは、ファイル/etc/os-releaseは実際に標準になりつつあり、ほとんどのOSに含まれるようになっています。したがって、Bashスクリプト内にファイルを含めるだけで、ここで説明するすべての変数にアクセスできます(例:NAME、VERSION、...)

だから私はちょうどこれを私のBashスクリプトで使用しています:

if [ -f /etc/os-release ]
then
        . /etc/os-release
else
        echo "ERROR: I need the file /etc/os-release to determine what my distribution is..."
        # If you want, you can include older or distribution specific files here...
        exit
fi

3

ファイル/etc/debian_versionが存在する場合、ディストリビューションはDebian、またはDebian派生物です。このファイルにはリリース番号が付いている場合があります。私のマシンでは現在のところ6.0.1です。テスト中または不安定な場合は、testing / unstableと表示されるか、今後のリリースの番号が表示される場合があります。私の印象では、少なくともUbuntuでは、このファイルは常にテスト/不安定であり、リリース番号は含まれていませんが、間違っていれば誰かが修正できます。

Fedora(少なくとも最新リリース)には、同様のファイル、つまりがあり/etc/fedora-releaseます。


新しいDebianバージョンでは、代わりに/ etc / os-releaseを使用します。
デレクソン

1
@Dereckson wheezyマシンをチェックしたところ、との両方が/etc/debian_versionあり/etc/os-releaseます。
ファヒムミタ

debootstrapで作成されたJessie chrootでテスト済み。しかし実際には、Jessieの下のローカルマシン(今回はより一般的な方法でインストールされ/etc/debian_versionます)にはファイルが含まれています。したがって、Debianのインストールを準備する方法は、利用可能なリリースファイルに影響を与える可能性があります。これは興味深いことです。
デレクソン

Debianにos-releaseは、からの完全なバージョン番号は含まれていませんdebian_versionunix.stackexchange.com/questions/382531を参照してください。
JdeBP


1

多くからの2つの方法:

1)使用する

lsb_release -a

CentOS 5.5とUbuntu 10.04でテストしました

CentOSの出力は次のとおりです。

LSB Version:    :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch 
Distributor ID: CentOS
Description:    CentOS release 5.5 (Final)
Release:        5.5
Codename:       Final

Ubuntuの場合:

LSB Version:    :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description:    CentOS release 5.5 (Final)
Release:        5.5
Codename:       Final

2)次のコマンドを入力します。

cat /etc/*-release

CentOS 5.5およびUbuntu 10.04でテストしましたが、正常に動作します。


lsb_releaseはCentOS 6(min install fwiw)にありません
コーダー

lsb_release -aは、Raspberry with RaspbianDebian 7.1派生)で「-bash:lsb_release:command not found」を返します。
ピーターモーテンセン14年

0

このスクリプトはDebianで動作します(Ubuntuで調整が必要な場合があります)

#!/usr/bin/env bash

echo "Finding Debian/ Ubuntu Codename..."

CODENAME=`cat /etc/*-release | grep "VERSION="`
CODENAME=${CODENAME##*\(}
CODENAME=${CODENAME%%\)*}

echo "$CODENAME"
# => saucy, precise, lucid, wheezy, squeeze

0

これが私の簡単なchech_distroバージョンです。^^;

#!/usr/bin/env bash
check_distro2(){
    if [[ -e /etc/redhat-release ]]
    then
      DISTRO=$(cat /etc/redhat-release)
    elif [[ -e /usr/bin/lsb_release ]]
    then
      DISTRO=$(lsb_release -d | awk -F ':' '{print $2}')
    elif [[ -e /etc/issue ]]
    then
      DISTRO=$(cat /etc/issue)
    else
      DISTRO=$(cat /proc/version)
    fi
    }

    check_distro2
    echo $DISTRO

0

バージョンなしでは、distのみ:

cat /etc/issue | head -n +1 | awk '{print $1}'

Yahya Yahyaouiによる1年前の回答も同じことを言った。これらの回答はどちらも2011年に実際に回答され、その後削除されました。それらが間違っている理由はまだ適用されます。
-JdeBP

0

これはUbuntu 14およびCentOS 7でテストされました

cat /etc/os-release | grep "PRETTY_NAME" | sed 's/PRETTY_NAME=//g' | sed 's/["]//g' | awk '{print $1}'

@don_crisstiどうしますか?
BsdHelper

sed -n -e '/PRETTY_NAME/ s/^.*=\|"\| .*//gp' /etc/os-release
cas

@casとても素敵です!それをツールボックスに追加します。共有していただきありがとうございます。
BsdHelper

0

ここから、一般的なLinuxディストのほとんどで機能する優れたスクリプトを見つけることができます。

#! /bin/bash
# return an awkable string consisting of
#    unix OS type, or
#    Linux dist, or
#    a long guess (based on /proc), or
#    no clue

giveUp () {
   echo "Unknown"
   exit 0
}

# keep this easily awkable, prepending an initial clue
versionGuess () {
   if [ -e /proc/version ]; then
      echo -n "Unsure "
      cat /proc/version
      exit 0
   fi
   return 1
}

# if we have ignition, print and exit
gotDist () {
   [ -n "$1" ] && echo "$1" && exit 0
}

# we are only interested in a single word "dist" here
# various malformations can occur; admin will have to code appropately based on output
linuxRelease () {
   if [ -r /etc/lsb-release ]; then
      dist=$(grep 'DISTRIB_ID' /etc/lsb-release | sed 's/DISTRIB_ID=//' | head -1)
      gotDist "$dist"
   fi

   dist=$(find /etc/ -maxdepth 1 -name '*release' 2> /dev/null | sed 's/\/etc\///' | sed 's/-release//' | head -1)
   gotDist "$dist"

   dist=$(find /etc/ -maxdepth 1 -name '*version' 2> /dev/null | sed 's/\/etc\///' | sed 's/-version//' | head -1)
   gotDist "$dist"

   return 1
}

# start with uname and branch the decision from there
dist=$(uname -s 2> /dev/null)
if [ "$dist" = "Linux" ]; then
   linuxRelease
   versionGuess
   giveUp
elif [ -n "$dist" ]; then
   echo "$dist"
   exit 0
else
   versionGuess
   giveUp
fi

# we shouldn't get here
giveUp
# done


0

OSのOSに関するいくつかの事実を提供するファクトルビーgemがあり、OSリリースファイル、その他のデータを分析し、端末画面に出力します。rubygemsのインストールから始めて、以下を試すことができます。

# apt-get install rubygems

OSに適した上記のケースを使用してください。次に、gem自体をインストールします。

# gem install facter

次に使用します:

$ facter

注:インストールの詳細については、ファクトのgemソースを参照してください。


0

誰かが同様にディストリビューションを必要とする場合:

#!/usr/bin/env bash

LINUX_VERSION_NAME=`lsb_release -sr`


# Distribution specific installation
if [[ ${LINUX_VERSION_NAME} == "18.04" ]]
then
    echo "It is: ${LINUX_VERSION_NAME}"

else
    echo "It is not ${LINUX_VERSION_NAME}"
fi

出力:

It is: 18.04

lsb_release -scに変更して、ディストリビューションを取得します。

LINUX_VERSION_NAME=`lsb_release -sc`


# Distribution specific installation
if [[ ${LINUX_VERSION_NAME} == "bionic" ]]
then
    echo "It is: ${LINUX_VERSION_NAME}"

else
    echo "It is not ${LINUX_VERSION_NAME}"
fi

出力:

It is: bionic

-3

このコマンドは、DebianベースおよびRedhatベースのディストリビューションtrで機能します。フィルターを使用して、ドキュメントを1行あたり1ワードの形式に変換し、ディストリビューション名を含む最初の行をカウントします。

tr -s ' \011' '\012' < /etc/issue | head -n 1

同じことを言った2011年から今削除された答えに関するコメントは、まだ適用されます。誤って配置された答えは、再び削除されましたが、これは/etc/issuezenwalkにバージョンまたは名前が含まれていなかったと言っています。これは、管理者が変更できるファイルで、人間に提示されるメッセージを含みますが、含まれる保証はありませんプログラムで取り出すことができるものいる。
-JdeBP
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.