GNU/Linux >> Linux の 問題 >  >> Linux

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

私は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

こののようです 動作するには、ubuntuを返します またはcentos (私は他の人を試していません)リリース名として。しかし、これを見つけるためのより簡単で信頼性の高い方法が必要だと感じています。それは本当ですか?

RedHatでは機能しません。
/etc / redhat-releaseに含まれるもの:
RedhatLinuxEntrepriseリリース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"

承認された回答:

OSを取得するには およびVER 、最新の標準は/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

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

関連:awkのprintとprintfの違いは何ですか?
Linux
  1. Linux ディストリビューション名とバージョンを取得するには?

  2. シェルスクリプトでフォークされた子プロセスから PID を取得する方法

  3. ls をファイル拡張子でソートしてから名前を付ける方法は?

  1. Linuxシェルスクリプトで関数を定義して使用する方法

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

  3. シェル スクリプトで外部 IP アドレスを取得するにはどうすればよいですか?

  1. Linuxシェルスクリプトで数値と文字列を比較する方法

  2. シェルスクリプトでUbuntuのバージョン、コードネーム、OSアーキテクチャを見つける方法

  3. リモートDNSサーバーのソフトウェア名とそのバージョンを識別する方法は?