Je travaille sur un script bash simple qui devrait pouvoir fonctionner sur les distributions Ubuntu et CentOS (la prise en charge de Debian et Fedora/RHEL serait un plus) et j'ai besoin de connaître le nom et la version de la distribution que le script exécute ( afin de déclencher des actions spécifiques, par exemple la création de référentiels). Pour l'instant, j'ai ceci :
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
Cela semble pour fonctionner, renvoyant ubuntu
ou centos
(Je n'en ai pas essayé d'autres) comme nom de version. Cependant, j'ai l'impression qu'il doit exister un moyen plus simple et plus fiable de le savoir. Est-ce vrai ?
Cela ne fonctionne pas pour RedHat.
/etc/redhat-release contient :
Redhat Linux Entreprise release 5.5
Donc, la version n'est pas le troisième mot, vous feriez mieux d'utiliser :
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"
Réponse acceptée :
Pour obtenir OS
et VER
, la dernière norme semble être /etc/os-release
.
Avant cela, il y avait lsb_release
et /etc/lsb-release
. Avant cela, vous deviez rechercher des fichiers différents pour chaque distribution.
Voici ce que je suggérerais
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
Je pense que uname
pour obtenir ARCH
est encore le meilleur moyen. Mais l'exemple que vous avez donné ne concerne évidemment que les systèmes Intel. Je l'appellerais soit BITS
comme ceci :
case $(uname -m) in
x86_64)
BITS=64
;;
i*86)
BITS=32
;;
*)
BITS=?
;;
esac
Ou modifier ARCH
être les versions les plus courantes, mais sans ambiguïté :x86
et x64
ou similaire :
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
mais bien sûr, c'est à vous de décider.
En relation :Quelle est la différence entre print et printf dans awk ?