lsb_release -a
es probable que sea su mejor opción para encontrar esta información y poder hacerlo de manera consistente.
Historia de LSB
El lsb
comando en ese significa el proyecto Linux Standards Base, que es un proyecto general patrocinado por la Fundación Linux para proporcionar métodos genéricos para hacer cosas básicas en varias distribuciones de Linux.
El proyecto es voluntario y los proveedores pueden participar dentro del proyecto solo como un usuario y también como facilitadores de las diversas especificaciones en torno a los diferentes módulos que ayudan a impulsar la estandarización dentro de las diferentes distribuciones de Linux.
extracto de la carta
El grupo de trabajo de LSB tiene, como su objetivo principal, abordar estas dos preocupaciones. Publicamos un estándar que describe el conjunto mínimo de API que una distribución debe admitir, en consulta con los principales proveedores de distribución. También proporcionamos pruebas y herramientas que miden el soporte para el estándar y permiten a los desarrolladores de aplicaciones apuntar al conjunto común. Finalmente, a través de nuestro trabajo de prueba, buscamos evitar divergencias innecesarias entre las distribuciones.
Enlaces útiles relacionados con LSB
Criticas
Hay una serie de problemas con LSB que lo hacen problemático para distribuciones como Debian. El uso forzado de RPM es uno. Consulte el artículo de Wikipedia para obtener más información al respecto .
Novell
Si busca, posiblemente se encontrará con una página de aspecto bastante anticuada titulada: Detectando la distribución subyacente de Linux de Novell. Este es uno de los pocos lugares en los que he visto una lista real que muestra varias de las principales distribuciones y cómo puede detectar qué subyacente está utilizando.
extracto
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
Esta misma página también incluye un útil script que intenta codificar lo anterior utilizando solo uname
comandos de vainilla y la presencia de uno de los archivos anteriores.
NOTA: Esta lista está fechada, pero puede eliminar fácilmente las distribuciones fechadas como Mandrake de la lista y reemplazarlas con alternativas. Este tipo de script podría ser un enfoque si está intentando admitir una gran variedad de variantes de Solaris y Linux.
Linux Mafia
Más búsquedas aparecerán en la siguiente página mantenida en Linuxmafia.com, titulada: / etc / release equivalentes para diversas distribuciones de Linux (y otras Unix) . Esta es probablemente la lista más exhaustiva hasta la fecha que he visto. Puede codificar esta lista con una declaración de caso / cambio e incluirla como parte de su distribución de software.
De hecho, hay una secuencia de comandos en la parte inferior de esa página que hace exactamente eso. Por lo tanto, simplemente puede descargar y usar el script como tercero para la distribución de su software.
guión
#!/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: ¡ Este script debería parecer familiar, es una versión actualizada del Novell!
Guión de espacio para las piernas
Otro método que he visto empleado es rodar su propia secuencia de comandos, similar al método Novell anterior, pero utilizando LSB en su lugar. Este artículo titulado: Método genérico para determinar el nombre de distribución de Linux (o UNIX) , muestra uno de estos métodos.
# 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
Este fragmento de código podría incluirse en un sistema /etc/bashrc
o en algún archivo de este tipo que luego establecería la variable de entorno $DISTRO
.
gcc
Lo creas o no, otro método es utilizarlo gcc
. Si consulta el comando gcc --version
, obtendrá la distribución para la que se creó gcc, que es invariablemente el mismo que el sistema en el que se está ejecutando.
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;
Entonces, ¿cuál debo usar? Tendería a elegir lsb_release -a
cualquier distribución de Linux que frecuentara (RedHat, Debian, Ubuntu, etc.). Para situaciones en las que está apoyando sistemas que no proporcionan lsb_release
, rodaría el mío como parte de la distribución de software que estoy proporcionando, similar a uno de los scripts anteriores.
ACTUALIZACIÓN # 1: Seguimiento con SuSE
Al hablar con @Nils en los comentarios a continuación, se determinó que, por cualquier motivo, SLES11 parecía dejar de instalar LSB por defecto. Era solo una instalación opcional, que parecía contraria a un paquete que proporciona este tipo de característica clave.
Entonces aproveché la oportunidad de contactar a alguien del proyecto OpenSuSE para tener una idea de por qué.
extracto de correo electrónico
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
Aquí está la respuesta de 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
debería ser suficiente fuera de Linux (espere posiblemente para los BSD).