GNU/Linux >> Tutoriels Linux >  >> Linux

Comment obtenir le nom de distribution et le numéro de version dans un simple script shell ?

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 ?
Linux
  1. Comment définir et utiliser des fonctions dans Linux Shell Script

  2. Comment obtenir le nom et la version de la distribution Linux ?

  3. Comment obtenir le PID d'un processus enfant forké dans un script shell

  4. Comment puis-je obtenir le nom de la distribution et le numéro de version dans un simple script shell ?

  5. Comment puis-je obtenir mon adresse IP externe dans un script shell ?

Trouver le nom de la distribution Linux, la version et les détails du noyau

Comment créer et exécuter un script shell dans Debian 10

Comment créer et exécuter un script Shell dans CentOS 8

Comment trouver le nom et la version de la distribution Linux

Comment créer et exécuter un script shell dans Ubuntu 22.04

Comment obtenir le pid d'un processus et invoquer kill -9 dessus dans le script shell ?