К сожалению, нет надежного и простого способа получить имя дистрибутива. Большинство основных дистрибутивов движемся к система, в которой они используют /etc/os-release для хранения этой информации. Большинство современных дистрибутивов также включают в себя lsb_release инструменты, но они не всегда устанавливаются по умолчанию. Итак, вот несколько подходов, которые вы можете использовать:
Воспользуйся /etc/os-release
awk -F= '/^NAME/{print $2}' /etc/os-release
Используйте lsb_release инструменты, если таковые имеются
lsb_release -d | awk -F"\t" '{print $2}'
Используйте более сложный скрипт, который должен работать для подавляющего большинства дистрибутивов:
# Determine OS platformUNAME=$(uname | tr "[:upper:]" "[:lower:]")# If Linux, try to determine specific distributionif [ "$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) fifi# For everything else (or if above failed), just use generic identifier[ "$DISTRO" == "" ] && export DISTRO=$UNAMEunset UNAME
Проанализируйте информацию о версии gcc если установлен:
CentOS 5.x
$ gcc --versiongcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)Copyright (C) 2006 Free Software Foundation, Inc.
CentOS 6.x
$ gcc --versiongcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)Copyright (C) 2010 Free Software Foundation, Inc.
$ gcc --versiongcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2Copyright (C) 2013 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Это в основном было непосредственно скопировано с замечательного сайта @ slm ответ на мой вопрос здесь.
Вам не нужен bash для выполнения такой задачи, и я бы посоветовал использовать высокоуровневый подход, чтобы избежать работы с такими файлами, как /etc/version и /etc/issue (У меня нет /etc/ версии на 13.10).
Поэтому я рекомендую использовать вместо этого эту команду:
Вот простой ответ, который, как я нахожу, работает во всех версиях Ubuntu / CentOS / RHEL благодаря простому присутствию файлов (не обязательно, конечно, если кто-то случайно удаляет / etc / redhat-release в ваших коробках Ubuntu и т. Д.):
if [ -f /etc/redhat-release ]; then yum updatefiif [ -f /etc/lsb-release ]; then apt-get updatefi
как-то yum -v возвращает ненулевое значение в CentOS, поэтому используйте which вместо, конечно, вы должны рассмотреть сценарий, если нет which установленный.
case "`/usr/bin/lsb_release -si`" in Ubuntu) echo 'This is Ubuntu Linux' ;; *) echo 'This is something else' ;; esac
должен делать то, что ты хочешь.
В более новых дистрибутивах Linux, основанных на systemd, также есть /etc/os-release, который предназначен для включения в сценарии оболочки с помощью команды source (.), как в
. /etc/os-releasecase "$ID" in ubuntu) echo 'This is Ubuntu Linux' ;; *) echo 'This is something else' ;; esac
Но в приведенном вами примере использования на самом деле вас может больше интересовать не название дистрибутива, а то, есть ли у него apt-get или yum. Вы могли бы просто проверить наличие файлов /usr/bin/apt-get или /usr/bin/yum с if [ -x /usr/bin/apt-get ]; then ... или для наличия связанных каталогов инфраструктуры, таких как /var/lib/apt и /etc/apt/.
Следующий скрипт должен указать, является ли это Ubuntu. Если это не так и единственным другим вариантом, который у вас есть, является CentOS, вы должны иметь его в else пункт:
if ! python -c "exec(\"import platform\nexit ('centos' not in platform.linux_distribution()[0].lower())\")" ; then echo "It is not CentOS distribution, ignoring CentOS setup" exit 0fi