GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie erhalte ich den Distributionsnamen und die Versionsnummer in einem einfachen Shell-Skript?

Ich arbeite an einem einfachen Bash-Skript, das auf Ubuntu- und CentOS-Distributionen ausgeführt werden kann (Unterstützung für Debian und Fedora/RHEL wäre ein Plus), und ich muss den Namen und die Version der Distribution kennen, auf der das Skript ausgeführt wird ( um bestimmte Aktionen auszulösen, zum Beispiel die Erstellung von Repositories). Bisher habe ich Folgendes:

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

Das scheint zu arbeiten und ubuntu zurückzugeben oder centos (Ich habe keine anderen ausprobiert) als Release-Name. Ich habe jedoch das Gefühl, dass es einen einfacheren und zuverlässigeren Weg geben muss, dies herauszufinden – ist das wahr?

Es funktioniert nicht für RedHat.
/etc/redhat-release enthält:
Redhat Linux Entreprise Release 5.5

Die Version ist also nicht das dritte Wort, Sie sollten besser :

verwenden
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"

Akzeptierte Antwort:

Um OS zu erhalten und VER , der neueste Standard scheint /etc/os-release zu sein .
Davor gab es lsb_release und /etc/lsb-release . Davor mussten Sie für jede Distribution nach anderen Dateien suchen.

Folgendes würde ich vorschlagen

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

Ich denke uname um ARCH zu erhalten ist immer noch der beste Weg. Aber das Beispiel, das Sie gegeben haben, behandelt offensichtlich nur Intel-Systeme. Ich würde es entweder BITS nennen so:

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

Oder ändern Sie ARCH um die gebräuchlicheren, aber eindeutigeren Versionen zu sein:x86 und x64 oder ähnlich:

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

aber das liegt natürlich bei dir.

Verwandte:Was ist der Unterschied zwischen print und printf in awk?
Linux
  1. Wie kann ich Dateien aus einem UNIX-Shell-Skript per FTP übertragen und herunterladen?

  2. Wie bekomme ich den Namen des aktuellen Git-Zweigs in eine Variable in einem Shell-Skript?

  3. So erhalten Sie die PID von einem gegabelten untergeordneten Prozess im Shell-Skript

  4. Wie kann ich den Distributionsnamen und die Versionsnummer in einem einfachen Shell-Skript erhalten?

  5. Wie kann ich meine externe IP-Adresse in einem Shell-Skript abrufen?

Finden Sie den Namen, die Version und die Kernel-Details der Linux-Distribution

So erstellen und führen Sie ein Shell-Skript in Debian 10 aus

So erstellen und führen Sie ein Shell-Skript in CentOS 8 aus

So finden Sie den Namen und die Version der Linux-Distribution

So erstellen und führen Sie ein Shell-Skript in Ubuntu 22.04 aus

Wie erhalte ich die PID eines Prozesses und rufe im Shell-Skript kill -9 darauf auf?