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 :
verwendenOS_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?