I'm working on a simple bash script that should be able to run on Ubuntu and CentOS distributions (support for Debian and Fedora/RHEL would be a plus) and I need to know the name and version of the distribution the script is running (in order to trigger specific actions, for instance the creation of repositories). So far what I've got is this:
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
This seems to work, returning ubuntu
or centos
(I haven't tried others) as the release name. However, I have a feeling that there must be an easier, more reliable way of finding this out — is that true?
It doesn't work for RedHat.
/etc/redhat-release contains :
Redhat Linux Entreprise release 5.5
So, the version is not the third word, you'd better use :
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"
Best Answer
To get
OS
andVER
, the latest standard seems to be/etc/os-release
. Before that, there waslsb_release
and/etc/lsb-release
. Before that, you had to look for different files for each distribution.Here's what I'd suggest
I think
uname
to getARCH
is still the best way. But the example you gave obviously only handles Intel systems. I'd either call itBITS
like this:Or change
ARCH
to be the more common, yet unambiguous versions:x86
andx64
or similar:but of course that's up to you.