私は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の違いは何ですか?