lsb_release -a
Скорее всего, это будет лучшим вариантом для поиска этой информации и возможности сделать это согласованным образом.
История LSB
Команда lsb
in that означает проект Linux Standards Base, являющийся зонтичным проектом, спонсируемым Linux Foundation, для предоставления общих методов выполнения базовых задач в различных дистрибутивах Linux.
Проект является добровольным, и поставщики могут участвовать в проекте как пользователь, а также как посредники в различных спецификациях для различных модулей, которые помогают стимулировать стандартизацию в различных дистрибутивах Linux.
выдержка из чартера
Рабочая группа LSB имеет своей основной целью решение этих двух проблем. Мы публикуем стандарт, который описывает минимальный набор API, который должен поддерживать дистрибутив, по согласованию с основными поставщиками дистрибутива. Мы также предоставляем тесты и инструменты, которые измеряют поддержку стандарта и позволяют разработчикам приложений ориентироваться на общий набор. Наконец, с помощью нашей работы по тестированию мы стремимся предотвратить ненужное расхождение между дистрибутивами.
Полезные ссылки, связанные с LSB
Критицизмы
Есть ряд проблем с LSB, которые делают его проблематичным для таких дистрибутивов, как Debian. Принудительное использование RPM. Смотрите статью в Википедии, чтобы узнать больше .
Novell
Если вы будете искать, вы, возможно, найдете довольно устаревшую страницу под названием: « Определение лежащего в основе дистрибутива Linux от Novell». Это одно из немногих мест, где я видел реальный список, который показывает несколько основных дистрибутивов и как вы можете определить, какой из них вы используете.
выдержка
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
Эта же страница также включает в себя удобный скрипт, который пытается кодифицировать вышеперечисленное, используя только ванильные uname
команды, и наличие одного из вышеуказанных файлов.
ПРИМЕЧАНИЕ. Этот список датирован, но вы можете легко удалить устаревшие дистрибутивы, такие как Mandrake, из списка и заменить их альтернативами. Этот тип сценария может быть одним из подходов, если вы пытаетесь поддерживать большое количество вариантов Solaris и Linux.
Linux Mafia
Дальнейший поиск приведет к появлению следующей страницы на Linuxmafia.com под названием: / etc / release эквиваленты для различных дистрибутивов Linux (и других Unix) . Это, наверное, самый полный список на сегодняшний день, который я когда-либо видел. Вы можете кодифицировать этот список с помощью оператора case / switch и включить его в свой дистрибутив программного обеспечения.
На самом деле в нижней части этой страницы есть скрипт, который делает именно это. Таким образом, вы можете просто загрузить и использовать скрипт в качестве стороннего поставщика для распространения вашего программного обеспечения.
скрипт
#!/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}
ПРИМЕЧАНИЕ: этот скрипт должен выглядеть знакомо, это современная версия Novell!
Сценарий места для ног
Другой метод, который я видел, - это использовать свой собственный скрипт, аналогичный описанному выше методу Novell, но вместо этого использовать LSB. В этой статье под названием « Общий метод определения имени распространения Linux (или UNIX)» показан один из таких методов.
# 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
Этот кусок кода может быть включен в системный /etc/bashrc
или некоторый такой файл, который затем установит переменную среды $DISTRO
.
НКУ
Верьте этому или нет другой метод состоит в том, чтобы использовать gcc
. Если вы запросите команду, gcc --version
вы получите дистрибутив, для которого был создан gcc, который неизменно совпадает с системой, в которой он работает.
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;
Так какой из них я должен использовать? Я бы предпочел использовать lsb_release -a
любые дистрибутивы Linux, которые я бы часто посещал (RedHat, Debian, Ubuntu и т. Д.). Для ситуаций, когда вы поддерживаете системы, которые не предоставляют, lsb_release
я бы включил свою собственную как часть поставляемого мной программного обеспечения, аналогично одному из приведенных выше сценариев.
ОБНОВЛЕНИЕ № 1: продолжение с SuSE
Говоря с @Nils в комментариях ниже, было установлено, что по какой-то причине SLES11, по-видимому, отбрасывает LSB из установленного по умолчанию. Это была только необязательная установка, которая казалась противодействующей пакету, который предоставляет ключевую функцию этого типа.
Поэтому я воспользовался возможностью, чтобы связаться с кем-то из проекта OpenSuSE, чтобы понять почему.
выдержка из электронной почты
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
Вот ответ Роба
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
должно быть достаточно за пределами Linux (возможно, для BSD).