lsb_release -a
provavelmente será sua melhor opção para descobrir essas informações e poder fazê-lo de maneira consistente.
História do LSB
O lsb
comando nesse termo representa o projeto Linux Standards Base, que é um projeto abrangente patrocinado pela Linux Foundation para fornecer métodos genéricos para fazer coisas básicas em várias distribuições Linux.
O projeto é voluntário e os fornecedores podem participar do projeto como apenas um usuário e também como facilitadores das várias especificações em torno de diferentes módulos que ajudam a impulsionar a padronização nas diferentes distribuições Linux.
trecho da carta
O grupo de trabalho da LSB tem como objetivo principal abordar essas duas preocupações. Publicamos um padrão que descreve o conjunto mínimo de APIs que uma distribuição deve suportar, em consulta com os principais fornecedores de distribuição. Também fornecemos testes e ferramentas que medem o suporte ao padrão e permitem que os desenvolvedores de aplicativos direcionem o conjunto comum. Finalmente, através de nosso trabalho de teste, procuramos evitar divergências desnecessárias entre as distribuições.
Links úteis relacionados ao LSB
Críticas
Existem vários problemas com o LSB que o tornam problemático para distribuições como o Debian. O uso forçado do RPM é um. Veja o artigo da Wikipedia para mais informações .
Novell
Se você pesquisar, provavelmente encontrará uma página com aparência bastante antiga, intitulada: Detecting Underlying Linux Distro da Novell. Este é um dos poucos lugares em que vi uma lista real que mostra várias das principais distribuições e como você pode detectar qual delas está sendo usada.
excerto
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
Essa mesma página também inclui um script útil que tenta codificar o que foi descrito acima usando apenas uname
comandos vanilla e a presença de um dos arquivos acima.
NOTA: Esta lista é datada, mas você pode facilmente remover as distribuições datadas, como Mandrake, da lista e substituí-las por alternativas. Esse tipo de script pode ser uma abordagem se você estiver tentando oferecer suporte a uma grande variedade de variantes do Solaris e Linux.
Máfia do Linux
Mais pesquisas aparecerão na seguinte página mantida no Linuxmafia.com, intitulada: / etc / release equivalents para diversas distribuições Linux (e outras Unix) . Esta é provavelmente a lista mais exaustiva que eu já vi. Você pode codificar esta lista com uma declaração case / switch e incluí-la como parte da sua distribuição de software.
De fato, há um script na parte inferior da página que faz exatamente isso. Assim, você pode simplesmente baixar e usar o script como terceiro na sua distribuição de software.
roteiro
#!/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: Esse script deve parecer familiar, é uma versão atualizada do Novell!
Script de espaço para as pernas
Outro método que vi empregar é lançar seu próprio script, semelhante ao método Novell acima, mas usando o LSB. Este artigo intitulado: Método genérico para determinar o nome da distribuição do Linux (ou UNIX) mostra um desses 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
Esse pedaço de código pode ser incluído no /etc/bashrc
arquivo de um sistema ou em algum desses arquivos que definiria a variável de ambiente $DISTRO
.
gcc
Acredite ou não, outro método é fazer uso gcc
. Se você consultar o comando, gcc --version
obterá a distribuição para a qual o gcc foi criado, que é invariavelmente igual ao sistema em que está sendo executado.
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;
Então, qual devo usar? Eu costumava usar lsb_release -a
todas as distribuições Linux que eu freqüentava (RedHat, Debian, Ubuntu, etc.). Nas situações em que você oferece suporte a sistemas que não fornecem, lsb_release
eu faria o meu próprio como parte da distribuição do software que estou fornecendo, semelhante a um dos scripts acima.
ATUALIZAÇÃO # 1: Acompanhamento do SuSE
Ao falar com o @Nils nos comentários abaixo, foi determinado que, por qualquer motivo, o SLES11 pareceu impedir que o LSB fosse instalado por padrão. Era apenas uma instalação opcional, que parecia contrária a um pacote que fornece esse tipo de recurso principal.
Então aproveitei a oportunidade para entrar em contato com alguém do projeto OpenSuSE para entender o porquê.
trecho de 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
Aqui está a resposta 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
deve ser suficiente fora do Linux (espere possivelmente pelos BSDs).