lsb_release -a
prawdopodobnie będzie najlepszą opcją dla znalezienia tych informacji i być w stanie to zrobić w spójny sposób.
Historia LSB
To lsb
polecenie oznacza projekt Linux Standards Base, który jest parasolowym projektem sponsorowanym przez Linux Foundation, zapewniającym ogólne metody wykonywania podstawowych czynności na różnych dystrybucjach Linuxa.
Projekt jest dobrowolny, a dostawcy mogą uczestniczyć w nim jako użytkownicy, a także jako facylitatorzy różnych specyfikacji dotyczących różnych modułów, które pomagają w standaryzacji w różnych dystrybucjach Linuksa.
Wyciąg z Karty
Grupa robocza LSB ma za swój główny cel zaradzić tym dwóm obawom. Publikujemy standard opisujący minimalny zestaw interfejsów API, które musi obsługiwać dystrybucja, w porozumieniu z głównymi dostawcami dystrybucji. Zapewniamy również testy i narzędzia, które mierzą wsparcie dla standardu i pozwalają twórcom aplikacji na wybranie wspólnego zestawu. Wreszcie, poprzez nasze prace testowe, staramy się zapobiec niepotrzebnej rozbieżności między dystrybucjami.
Przydatne linki związane z LSB
Krytyka
Istnieje wiele problemów z LSB, które sprawiają, że jest to problematyczne dla dystrybucji takich jak Debian. Wymuszone użycie RPM jest jednym. Więcej informacji na ten temat znajduje się w artykule w Wikipedii .
Novell
Jeśli szukasz, prawdopodobnie natkniesz się na dość przestarzałą stronę zatytułowaną: Wykrywanie bazowej dystrybucji Linuksa firmy Novell. Jest to jedno z niewielu miejsc, w których widziałem rzeczywistą listę, która pokazuje kilka głównych dystrybucji i jak możesz wykryć, z którego podstawowego korzystasz.
fragment
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
Ta sama strona zawiera także przydatny skrypt, który próbuje skodyfikować powyższe za pomocą tylko waniliowych uname
poleceń i obecności jednego z powyższych plików.
UWAGA: Ta lista jest datowana, ale można łatwo usunąć z niej datowane dystrybucje, takie jak Mandrake, i zastąpić je alternatywami. Ten typ skryptu może być jednym z podejść, jeśli próbujesz obsłużyć duży zbiór wariantów Solaris i Linux.
Linux Mafia
Dalsze wyszukiwanie spowoduje wyświetlenie następującej strony utrzymywanej na Linuxmafia.com, zatytułowanej: / etc / release odpowiedniki dla różnych dystrybucji Linuksa (i innych uniksowych) . To chyba najbardziej wyczerpująca lista, jaką do tej pory widziałem. Możesz skodyfikować tę listę za pomocą instrukcji case / switch i dołączyć ją jako część dystrybucji oprogramowania.
W rzeczywistości na dole tej strony znajduje się skrypt, który właśnie to robi. Możesz więc po prostu pobrać skrypt i używać go jako strony trzeciej w dystrybucji oprogramowania.
scenariusz
#!/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}
UWAGA: Ten skrypt powinien wyglądać znajomo, jest to aktualna wersja Novella!
Scenariusz miejsca na nogi
Inną metodą, którą widziałem, jest uruchomienie własnego skryptu, podobnego do powyższej metody Novella, ale zamiast tego użycie LSB. W tym artykule zatytułowanym: Ogólna metoda określania nazwy dystrybucji systemu Linux (lub UNIX) pokazano jedną z takich metod.
# 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
Ten fragment kodu może zostać włączony do pliku systemowego /etc/bashrc
lub innego takiego pliku, który następnie ustawi zmienną środowiskową $DISTRO
.
gcc
Wierzcie lub nie, inną metodą jest wykorzystanie gcc
. Jeśli gcc --version
zapytasz o polecenie , otrzymasz dystrybucję, dla której zbudowano gcc, która jest niezmiennie taka sama jak system, na którym działa.
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;
Którego powinienem użyć? Chciałbym raczej iść z lsb_release -a
wszelkich dystrybucjach systemu Linux, które chciałbym częste (RedHat, Debian, Ubuntu, itd.). W sytuacjach, w których wspierasz systemy, które nie zapewniają lsb_release
, stworzę własne w ramach dystrybucji oprogramowania, które zapewniam, podobnie jak w jednym z powyższych skryptów.
AKTUALIZACJA # 1: Kontynuacja za pomocą SuSE
Mówiąc z @Nils w poniższych komentarzach ustalono, że z jakiegokolwiek powodu SLES11 wydawał się domyślnie usuwać LSB z instalacji. Była to tylko opcjonalna instalacja, która wydawała się przeciwna pakietowi, który zapewnia tego rodzaju kluczową funkcję.
Skorzystałem więc z okazji, aby skontaktować się z kimś z projektu OpenSuSE, aby dowiedzieć się, dlaczego.
fragment wiadomości 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
Oto odpowiedź Roba
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
powinno wystarczyć poza Linuksem (prawdopodobnie w przypadku BSD).