lsb_release -a
Dies ist wahrscheinlich die beste Option, um diese Informationen herauszufinden und dies auf konsistente Weise zu tun.
Geschichte der LSB
Der lsb
Befehl in diesem Befehl steht für das Projekt Linux Standards Base , ein von der Linux Foundation gesponsertes Rahmenprojekt , das allgemeine Methoden für grundlegende Aufgaben in verschiedenen Linux-Distributionen bereitstellt.
Das Projekt ist freiwillig, und Anbieter können sich nur als Benutzer und als Vermittler der verschiedenen Spezifikationen für verschiedene Module, die dazu beitragen, die Standardisierung in den verschiedenen Linux-Distributionen voranzutreiben, an dem Projekt beteiligen.
Auszug aus der Charter
Die LSB-Arbeitsgruppe hat sich zum Ziel gesetzt, diese beiden Anliegen anzusprechen. Wir veröffentlichen einen Standard, der die Mindestanzahl von APIs beschreibt, die eine Distribution in Absprache mit den wichtigsten Distributionsanbietern unterstützen muss. Wir stellen auch Tests und Tools zur Verfügung, mit denen die Unterstützung für den Standard gemessen und Anwendungsentwickler in die Lage versetzt werden, auf den gemeinsamen Satz abzustimmen. Schließlich versuchen wir durch unsere Testarbeit, unnötige Abweichungen zwischen den Distributionen zu verhindern.
Nützliche Links zu LSB
Kritikpunkte
Es gibt eine Reihe von Problemen mit LSB, die es für Distributionen wie Debian problematisch machen. Die erzwungene Verwendung von RPM ist eine. Weitere Informationen finden Sie im Wikipedia-Artikel .
Novell
Wenn Sie suchen, werden Sie möglicherweise auf eine ziemlich veraltete Seite mit dem Titel stoßen: Erkennen der zugrunde liegenden Linux-Distribution von Novell. Dies ist einer der wenigen Orte, an denen ich eine aktuelle Liste gesehen habe, in der mehrere der wichtigsten Distributionen aufgeführt sind und wie Sie feststellen können, welche zugrunde liegende Distribution Sie verwenden.
Auszug
Novell SUSE /etc/SUSE-release
Red Hat /etc/redhat-release, /etc/redhat_version
Fedora /etc/fedora-release
Slackware /etc/slackware-release, /etc/slackware-version
Debian /etc/debian_release, /etc/debian_version,
Mandrake /etc/mandrake-release
Yellow dog /etc/yellowdog-release
Sun JDS /etc/sun-release
Solaris/Sparc /etc/release
Gentoo /etc/gentoo-release
UnitedLinux /etc/UnitedLinux-release
ubuntu /etc/lsb-release
Auf derselben Seite befindet sich auch ein praktisches Skript, das versucht, das oben Genannte mit nur Vanille- uname
Befehlen und dem Vorhandensein einer der oben genannten Dateien zu codieren.
HINWEIS: Diese Liste ist veraltet, aber Sie können die veralteten Distributionen wie Mandrake leicht aus der Liste streichen und durch Alternativen ersetzen. Diese Art von Skript ist möglicherweise ein Ansatz, wenn Sie versuchen, eine Vielzahl von Solaris- und Linux-Varianten zu unterstützen.
Linux Mafia
Weitere Suchanfragen finden Sie auf der folgenden Seite unter Linuxmafia.com mit dem Titel: / etc / release equivalents für verschiedene Linux-Distributionen (und andere Unix-Distributionen) . Dies ist wahrscheinlich die umfassendste Liste, die ich bisher gesehen habe. Sie können diese Liste mit einer case / switch-Anweisung verschlüsseln und in Ihre Softwareverteilung aufnehmen.
Tatsächlich gibt es am Ende dieser Seite ein Skript, das genau das tut. Sie können das Skript also einfach herunterladen und als Drittanbieter für Ihre Softwareverteilung verwenden.
Skript
#!/bin/sh
# Detects which OS and if it is Linux then it will detect which Linux
# Distribution.
OS=`uname -s`
REV=`uname -r`
MACH=`uname -m`
GetVersionFromFile()
{
VERSION=`cat $1 | tr "\n" ' ' | sed s/.*VERSION.*=\ // `
}
if [ "${OS}" = "SunOS" ] ; then
OS=Solaris
ARCH=`uname -p`
OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
elif [ "${OS}" = "AIX" ] ; then
OSSTR="${OS} `oslevel` (`oslevel -r`)"
elif [ "${OS}" = "Linux" ] ; then
KERNEL=`uname -r`
if [ -f /etc/redhat-release ] ; then
DIST='RedHat'
PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
elif [ -f /etc/SuSE-release ] ; then
DIST=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
elif [ -f /etc/mandrake-release ] ; then
DIST='Mandrake'
PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
elif [ -f /etc/debian_version ] ; then
DIST="Debian `cat /etc/debian_version`"
REV=""
fi
if [ -f /etc/UnitedLinux-release ] ; then
DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
fi
OSSTR="${OS} ${DIST} ${REV}(${PSUEDONAME} ${KERNEL} ${MACH})"
fi
echo ${OSSTR}
HINWEIS: Dieses Skript sollte vertraut aussehen, es ist eine aktuelle Version von Novell!
Skript zur Beinfreiheit
Eine andere Methode, die ich verwendet habe, besteht darin, ein eigenes Skript zu erstellen, ähnlich der obigen Novell-Methode, aber stattdessen LSB zu verwenden. Dieser Artikel mit dem Titel: Generische Methode zur Ermittlung des Linux- (oder UNIX-) Verteilungsnamens zeigt eine solche Methode.
# Determine OS platform
UNAME=$(uname | tr "[:upper:]" "[:lower:]")
# If Linux, try to determine specific distribution
if [ "$UNAME" == "linux" ]; then
# If available, use LSB to identify distribution
if [ -f /etc/lsb-release -o -d /etc/lsb-release.d ]; then
export DISTRO=$(lsb_release -i | cut -d: -f2 | sed s/'^\t'//)
# Otherwise, use release info file
else
export DISTRO=$(ls -d /etc/[A-Za-z]*[_-][rv]e[lr]* | grep -v "lsb" | cut -d'/' -f3 | cut -d'-' -f1 | cut -d'_' -f1)
fi
fi
# For everything else (or if above failed), just use generic identifier
[ "$DISTRO" == "" ] && export DISTRO=$UNAME
unset UNAME
Dieser Codeabschnitt könnte in die /etc/bashrc
Datei eines Systems oder in eine solche Datei eingefügt werden, die dann die Umgebungsvariable setzt $DISTRO
.
gcc
Ob Sie es glauben oder nicht, eine andere Methode ist es, davon Gebrauch zu machen gcc
. Wenn Sie den Befehl abfragen, erhalten gcc --version
Sie die Distribution, für die gcc erstellt wurde. Diese entspricht in jedem Fall dem System, auf dem es ausgeführt wird.
Fedora 14
$ gcc --version
gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
Copyright (C) 2010 Free Software Foundation, Inc.
CentOS 5.x
$ gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
Copyright (C) 2006 Free Software Foundation, Inc.
CentOS 6.x
$ gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
Copyright (C) 2010 Free Software Foundation, Inc.
Ubuntu 12.04
$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
TL; DR;
Also welches sollte ich verwenden? Ich würde dazu tendieren, lsb_release -a
Linux-Distributionen zu kaufen, die ich häufig verwenden würde (RedHat, Debian, Ubuntu usw.). In Situationen, in denen Sie Systeme unterstützen, die ich nicht zur Verfügung lsb_release
stelle, rolle ich meine eigene als Teil der Verteilung der von mir bereitgestellten Software, ähnlich einem der oben genannten Skripte.
UPDATE # 1: Follow-up mit SuSE
Im Gespräch mit @Nils in den Kommentaren unten wurde festgestellt, dass SLES11 aus irgendeinem Grund die Installation von LSB standardmäßig eingestellt hat. Es war nur eine optionale Installation, die für ein Paket, das diese Art von Schlüsselfunktion bietet, als kontraproduktiv erschien.
Deshalb habe ich die Gelegenheit genutzt, jemanden aus dem OpenSuSE-Projekt zu kontaktieren, um herauszufinden, warum.
Auszug aus der E-Mail
Hi Rob,
I hope you don't mind me contacting you directly but I found your info here:
https://en.opensuse.org/User:Rjschwei. I participate on one of the StackExchange
sites, Unix & Linux and a question recently came up regarding the best option
for determining the underlying OS.
http://unix.stackexchange.com/questions/92199/how-can-i-reliably-get-the-operating-systems-name/92218?noredirect=1#comment140840_92218
In my answer I suggested using lsb_release, but one of the other users mentioned
that this command wasn't installed as part of SLES11 which kind of surprised me.
Anyway we were looking for some way to confirm whether this was intentionally
dropped from SLES or it was accidental.
Would you know how we could go about confirming this one way or another?
Thanks for reading this, appreciate any help and/or guidance on this.
-Sam Mingolelli
http://unix.stackexchange.com/users/7453/slm
Hier ist Robs Antwort
Hi,
On 10/01/2013 09:31 AM, Sam Mingo wrote:
- show quoted text -
lsb_release was not dropped in SLES 11. SLES 11 is LSB certified. However, it
is not installed by default, which is consistent with pretty much every other
distribution. The lsb_release command is part of the lsb-release package.
At present almost every distribution has an entry in /etc such as
/etc/SuSE-release for SLES and openSUSE. Since this is difficult for ISVs and
others there is a standardization effort going on driven by the convergence to
systemd. The standard location for distribution information in the future will
be /etc/os-release, although Ubuntu will probably do something different.
HTH,
Robert
-- Robert Schweikert MAY THE SOURCE BE WITH YOU
SUSE-IBM Software Integration Center LINUX
Tech Lead
Public Cloud Architect
uname -s
sollte außerhalb von Linux reichen (evtl. für die BSDs rechnen).