lsb_release -a
sarà probabilmente l'opzione migliore per scoprire queste informazioni e riuscire a farlo in modo coerente.
Storia dell'LSB
Il lsb
comando in questo sta per il progetto Linux Standards Base, che è un progetto ombrello sponsorizzato dalla Linux Foundation per fornire metodi generici per fare cose di base su varie distribuzioni Linux.
Il progetto è volontario e i fornitori possono partecipare al progetto solo come utente e anche come facilitatori delle varie specifiche relative a diversi moduli che aiutano a guidare la standardizzazione all'interno delle diverse distribuzioni Linux.
estratto dalla carta
Il gruppo di lavoro LSB deve, come obiettivo principale, affrontare queste due preoccupazioni. Pubblichiamo uno standard che descrive il set minimo di API che una distribuzione deve supportare, in consultazione con i principali distributori. Forniamo inoltre test e strumenti che misurano il supporto per lo standard e consentono agli sviluppatori di applicazioni di scegliere come target l'insieme comune. Infine, attraverso il nostro lavoro di test, cerchiamo di prevenire inutili divergenze tra le distribuzioni.
Link utili relativi a LSB
critiche
Ci sono una serie di problemi con LSB che lo rendono problematico per distro come Debian. L'uso forzato di RPM è uno. Vedi l' articolo di Wikipedia per ulteriori informazioni sulla questione .
Novell
Se effettui una ricerca, ti imbatterai in una pagina dall'aspetto piuttosto datato intitolata: Detecting Sottostante Linux Distro di Novell. Questo è uno dei pochi posti in cui ho visto un elenco reale che mostra alcune delle principali distro e come è possibile rilevare quale sottostante si sta utilizzando.
estratto
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
Questa stessa pagina include anche un utile script che tenta di codificare quanto sopra usando solo uname
comandi vanilla e la presenza di uno dei file sopra.
NOTA: questo elenco è datato ma è possibile eliminare facilmente le distro datate come Mandrake dall'elenco e sostituirle con alternative. Questo tipo di script potrebbe essere un approccio se stai tentando di supportare una vasta gamma di varianti di Solaris e Linux.
Mafia Linux
Altre ricerche mostreranno la seguente pagina mantenuta su Linuxmafia.com, intitolata: / etc / release equivalents per varie distribuzioni Linux (e altre Unix) . Questa è probabilmente la lista più completa che abbia mai visto. È possibile codificare questo elenco con un'istruzione case / switch e includerlo come parte della distribuzione del software.
In effetti c'è uno script in fondo a quella pagina che fa esattamente questo. Quindi puoi semplicemente scaricare e utilizzare lo script come terza parte nella tua distribuzione software.
copione
#!/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}
NOTA: questo script dovrebbe apparire familiare, è una versione aggiornata di Novell!
Script per le gambe
Un altro metodo che ho visto impiegato è di girare il tuo script, simile al metodo Novell sopra ma facendo invece uso di LSB. Questo articolo intitolato: Metodo generico per determinare il nome di distribuzione Linux (o UNIX) , mostra uno di questi metodi.
# 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
Questo blocco di codice potrebbe essere incluso in un file di sistema /etc/bashrc
o in alcuni di questi file che quindi imposterebbe la variabile di ambiente $DISTRO
.
gcc
Che ci crediate o no, è un altro metodo da utilizzare gcc
. Se richiedi il comando gcc --version
otterrai la distro per cui è stato creato gcc, che è invariabilmente uguale al sistema su cui è in esecuzione.
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;
Quindi quale dovrei usare? Tenderei ad andare lsb_release -a
per qualsiasi distribuzione Linux che frequenterei (RedHat, Debian, Ubuntu, ecc.). Per le situazioni in cui stai supportando i sistemi che non forniscono, lsb_release
eseguirò il mio come parte della distribuzione del software che sto fornendo, simile a uno degli script sopra.
AGGIORNAMENTO N. 1: follow-up con SuSE
Parlando con @Nils nei commenti sottostanti, è stato stabilito che, per qualsiasi motivo, SLES11 sembrava non installare LSB per impostazione predefinita. Era solo un'installazione opzionale, che sembrava controproducente per un pacchetto che fornisce questo tipo di funzionalità chiave.
Quindi ho colto l'occasione per contattare qualcuno del progetto OpenSuSE per avere un'idea del perché.
estratto di 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
Ecco la risposta di Rob
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
dovrebbe essere abbastanza al di fuori di Linux (aspettarsi possibilmente per i BSD).