lsb_release -a
швидше за все, це буде найкращим варіантом пошуку цієї інформації та її можливості послідовно виконувати.
Історія ЛСБ
Команда lsb
в цій програмі розшифровує проект Linux Standards Base, який є парасольковим проектом, спонсоруваним Фондом Linux, для надання загальних методів для виконання основних видів речей у різних дистрибутивах Linux.
Проект є добровільним, і постачальники можуть брати участь у проекті як просто користувач, а також як фасилітатори різних специфікацій навколо різних модулів, які допомагають сприяти стандартизації в різних дистрибутивах Linux.
витяг із статуту
Основна мета робочої групи LSB - вирішити ці дві проблеми. Ми публікуємо стандарт, який описує мінімальний набір API, який повинен підтримувати дистрибутив, узгоджуючись з основними постачальниками дистрибуції. Ми також надаємо тести та інструменти, які вимірюють підтримку стандарту, і дозволяють розробникам додатків орієнтуватися на загальний набір. Нарешті, завдяки нашій тестовій роботі ми прагнемо не допустити зайвих розбіжностей між розподілами.
Корисні посилання, пов'язані з LSB
Критики
Існує ряд проблем з LSB, які роблять його проблематичним для таких дистрибутивів, як Debian. Примусове використання RPM є одним. Докладніше з цього питання див . У статті Вікіпедії .
Novell
Якщо ви шукаєте, можливо, ви натрапите на досить застарілу сторінку з назвою: Виявлення базового Linux Distro від 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!
Сценарій Legroom
Ще один метод, який я бачив, - це розгорнути свій власний сценарій, подібний до вищевказаного методу 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
. Якщо ви 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).