単純なシェルスクリプトから展開名とバージョン番号をどのように取得できますか?

単純なシェルスクリプトから展開名とバージョン番号をどのように取得できますか?

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他は試していません)、公開名として使用します。しかし、この問題を見つけるためのより簡単で信頼できる方法があるべきだと思います。それは本当ですか?

Red Hatでは動作しません。 /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"

ベストアンサー1

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または、より一般的であいまいなバージョンに変更するか、次のようにx86x64ます。

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

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

おすすめ記事