GNU/Linux >> Linux Esercitazione >  >> Linux

Come ottenere il nome della distribuzione e il numero di versione in un semplice script di shell?

Sto lavorando su un semplice script bash che dovrebbe essere in grado di essere eseguito su distribuzioni Ubuntu e CentOS (il supporto per Debian e Fedora/RHEL sarebbe un vantaggio) e ho bisogno di conoscere il nome e la versione della distribuzione che lo script sta eseguendo ( al fine di attivare azioni specifiche, ad esempio la creazione di repository). Finora quello che ho è questo:

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

Questo sembra per funzionare, restituendo ubuntu o centos (Non ne ho provati altri) come nome della versione. Tuttavia, ho la sensazione che ci debba essere un modo più semplice e affidabile per scoprirlo — è vero?

Non funziona per RedHat.
/etc/redhat-release contiene:
Redhat Linux Entreprise versione 5.5

Quindi, la versione non è la terza parola, faresti meglio a usare :

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"

Risposta accettata:

Per ottenere OS e VER , l'ultimo standard sembra essere /etc/os-release .
Prima c'era lsb_release e /etc/lsb-release . Prima di allora, dovevi cercare file diversi per ogni distribuzione.

Ecco cosa suggerirei

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

Penso uname per ottenere ARCH è ancora il modo migliore. Ma l'esempio che hai fornito ovviamente gestisce solo i sistemi Intel. Lo chiamerei BITS così:

case $(uname -m) in
x86_64)
    BITS=64
    ;;
i*86)
    BITS=32
    ;;
*)
    BITS=?
    ;;
esac

Oppure cambia ARCH essere le versioni più comuni, ma non ambigue:x86 e x64 o simili:

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

ma ovviamente dipende da te.

Correlati:qual è la differenza tra print e printf in awk?
Linux
  1. Come trovare la versione di Ubuntu, il nome in codice e l'architettura del sistema operativo in Shell Script

  2. Come ottenere l'indirizzo IP esterno in uno script di shell?

  3. Come ottenere il proprio indirizzo IP e salvarlo in una variabile in uno script di shell?

  4. Come si ftp e si scaricano file da uno script di shell UNIX

  5. Come ottenere il nome e la versione della distribuzione Linux?

Trova il nome della distribuzione Linux, la versione e i dettagli del kernel

Come creare ed eseguire uno script di shell in Debian 10

Come creare ed eseguire uno script di shell in CentOS 8

Come trovare il nome e la versione della versione della distribuzione Linux

Come creare ed eseguire uno script di shell in Ubuntu 22.04

Come ottenere il PID dal processo figlio biforcuto nello script della shell