Как я могу получить имя распределения и номер версии в простом сценарии оболочки?

Для узкого определения файла:

 find . -maxdepth 1 -type f | wc -l
194
07.12.2019, 22:41
21 ответ

Добираться OS и VER, последний стандарт, кажется, /etc/os-release. Перед этим, был lsb_release и /etc/lsb-release. Перед этим необходимо было искать различные файлы для каждого распределения.

Вот то, что я предложил бы

if [ -f /etc/os-release ]; then
    # freedesktop.org and systemd
    . /etc/os-release
    OS=$NAME
    VER=$VERSION_ID
elif type lsb_release >/dev/null 2>&1; then
    # linuxbase.org
    OS=$(lsb_release -si)
    VER=$(lsb_release -sr)
elif [ -f /etc/lsb-release ]; then
    # For some versions of Debian/Ubuntu without lsb_release command
    . /etc/lsb-release
    OS=$DISTRIB_ID
    VER=$DISTRIB_RELEASE
elif [ -f /etc/debian_version ]; then
    # Older Debian/Ubuntu/etc.
    OS=Debian
    VER=$(cat /etc/debian_version)
elif [ -f /etc/SuSe-release ]; then
    # Older SuSE/etc.
    ...
elif [ -f /etc/redhat-release ]; then
    # Older Red Hat, CentOS, etc.
    ...
else
    # Fall back to uname, e.g. "Linux <version>", also works for BSD, etc.
    OS=$(uname -s)
    VER=$(uname -r)
fi

Я думаю uname добираться ARCH все еще лучший способ. Но пример Вы дали очевидно только дескрипторам системы Intel. Я или назвал бы его BITS как это:

case $(uname -m) in
x86_64)
    BITS=64
    ;;
i*86)
    BITS=32
    ;;
*)
    BITS=?
    ;;
esac

Или изменение ARCH быть более общими, все же однозначными версиями: x86 и x64 или подобный:

case $(uname -m) in
x86_64)
    ARCH=x64  # or AMD64 or Intel64 or whatever
    ;;
i*86)
    ARCH=x86  # or IA32 or Intel32 or whatever
    ;;
*)
    # leave ARCH as-is
    ;;
esac

но конечно Вам решать

190
27.01.2020, 19:28
  • 1
    я проверил бы на lsb_release и использовал бы его при наличии, но это не доступно везде. Например, это не находится в установке по умолчанию Fedora 14. –  Steven D 24.01.2011, 07:47
  • 2
    Действительно? Вы пытались записать его с - и _? Возможно, это находится в /lib/lsb или где-нибудь как этот. Что делает rpm -qa "lsb*" печать? –  Mikel 24.01.2011, 07:56
  • 3
    rpm -qa "lsb* печать ничто. Согласно yum provides */lsb_release это содержится в пакете, названном redhat-lsb, который я предполагаю, не установлен по умолчанию. Однако я не эксперт по Fedora, это просто результаты случайного Fedora VM, который я имею и мог быть очень неправым. –  Steven D 24.01.2011, 08:01
  • 4
    Просто установленный Fedora 14 в VM, и существует нет lsb-release, поскольку Вы сказали. –  Mikel 24.01.2011, 08:07
  • 5
    Не использовать $OS, $VERSION, и т.д. - условно, мы используем для своей выгоды переменные среды (ПЕЙДЖЕР, РЕДАКТОР, ОБОЛОЧКА...) и внутренние переменные оболочки (BASH_VERSION, СЛУЧАЙНЫЙ...). Все другие имена переменной должны содержать по крайней мере одну строчную букву. Эта конвенция старается не случайно переопределять переменные окружения и внутренние переменные. –  Chris Down 16.09.2011, 23:18

Если файл /etc/debian_version существует, распределением является Debian или производная Debian. Этот файл может иметь номер выпуска; на моей машине это в настоящее время 6.0.1. Если это тестирует или нестабильное, это может сказать, что тестирование / нестабильный, или может иметь количество предстоящего выпуска. Мое впечатление - то, что на Ubuntu, по крайней мере, этот файл всегда является тестированием / нестабильный, и что они не помещают номер выпуска в него, но кто-то может исправить меня, если я неправ.

Fedora (недавние выпуски, по крайней мере), имейте подобный файл, а именно, /etc/fedora-release.

3
27.01.2020, 19:28
  • 1
    Более новые версии Debian используют/etc/os-release вместо этого. –  Dereckson 24.03.2015, 22:14
  • 2
    @Dereckson я проверил свою хрипящую машину, и она имеет обоих /etc/debian_version и /etc/os-release. –  Faheem Mitha 24.03.2015, 22:17
  • 3
    Протестированный в Jessie chroot созданный с debootstrap. Но действительно, локальная машина также при Jessie, на этот раз установил более стандартный путь, содержит a /etc/debian_version файл. Таким образом, способ, которым мы готовим установку Debian, мог влиять на доступные файлы версии, это интересно. –  Dereckson 28.03.2015, 12:05
  • 4
    os-release не включает число полной версии от debian_version. См. unix.stackexchange.com/questions/382531. –  JdeBP 29.07.2017, 10:08

В порядке самого вероятного успеха, их:

cat /etc/*version
cat /proc/version #linprocfs/version for FreeBSD when "linux" enabled
cat /etc/*release
uname -rv

покройте большинство случаев (AFAIK): Debian, Ubuntu, Slackware, SuSe, Redhat, хинду, *BSD и возможно другие.

6
27.01.2020, 19:28
  • 1
    cat /etc/*version не работает (нет такого файла) на CentOS (по крайней мере, на 6,4) –  om-nom-nom 23.10.2013, 15:32
  • 2
    ответа при выполнении команды в контейнере,/proc/version, будет содержать версию распределения ХОСТА а не контейнерное распределение один. –  Dereckson 24.03.2015, 22:14

Острота, нейтрализации, одна строка вывода, никаких ошибок.

( lsb_release -ds || cat /etc/*release || uname -om ) 2>/dev/null | head -n1
22
27.01.2020, 19:28
  • 1
    Красивый, спасибо. Обратите внимание, что это все еще не работает над Mac OS X, но он хорошо работает на Ubuntu и CentOS (которые являются тремя, которые я имею удобный). –  Wildcard 23.12.2015, 05:32
  • 2
    Brilliant! Почему такой ответ bueatiful не на вершине? –  Neo 28.03.2017, 05:08

lsb_release -a. Работы над Debian и я предполагаю Ubuntu, но я не уверен в остальных. Обычно это должно существовать во всем GNU/дистрибутивах Linux, так как это - LSB (Основа Стандарта Linux) связанный.

36
27.01.2020, 19:28
  • 1
    Это не установлено по умолчанию на хинду. Это не был по умолчанию на Fedora ни один в какой-то момент (вероятно, теперь хотя) –  Mat 29.03.2011, 22:13
  • 2
    Это работало над Debian, сжимают, Fedora 14 и OpenSUSE 11.3. На Debian и SUSE пакет, содержащий lsb_release, был lsb-выпуском, на Fedora это был redhat-lsb. Это было уже установлено на Debian и SUSE, но не на Fedora. Я думаю, что это - лучший ответ до сих пор. +1. –  Faheem Mitha 29.03.2011, 23:09
  • 3
    lsb_release не является частью CentOS 6 минимальная установка. –  a coder 08.10.2013, 18:30
  • 4
    lsb_release-a возвращается "-удар: lsb_release: команда, не найденная" на Малине с Raspbian (полученный Debian 7.1). –  Peter Mortensen 05.06.2014, 14:32
  • 5
    lsb_release-a работает над Red Hat Enterprise выпуск 6.6 Сервера Linux (Сантьяго) –  jwilleke 28.01.2015, 15:56

Я пошел бы с этим как первый шаг:

ls /etc/*release

Хинду, RedHat, Arch & SuSE назвали файл, например. /etc/gentoo-release. Кажется, популярен, проверяет этот сайт о файлах версии.

Debian & Ubuntu должна иметь a /etc/lsb-release который содержит информацию о выпуске также и обнаружится с предыдущей командой.

Другой быстрый uname -rv. Если установленное ядро будет ядром дистрибутива запаса, то Вы будете обычно иногда находить имя там.

58
27.01.2020, 19:28
  • 1
    На Debian это uname -a. –  tshepang 29.03.2011, 23:31
  • 2
    не делает uname -rv содержать информацию хотя? uname -a распечатает вещи как тип процессора и имени хоста, которые не важны здесь. (Но оба выпуска ядра (-r) и версия (-v) необходимы, не, все дистрибутивы делают это то же там), –  Mat 29.03.2011, 23:34
  • 3
    uname-r дает 2.6.32-5-686-bigmem и uname-v дает #1 SMP Tue Mar 8 22:14:55 UTC 2011 на Debian 6. uname-a OTOH дает Linux debian 2.6.32-5-686-bigmem #1 SMP Tue Mar 8 22:14:55 UTC 2011 i686 GNU/Linux. –  tshepang 30.03.2011, 01:22
  • 4
    вторая часть uname -a -n, т.е. nodename == имя хоста. таким образом, я сказал бы uname не будет интересно на Debian. Задумайтесь о нем, я не уверен, что это настолько полезно на Redhat также. –  Mat 30.03.2011, 01:26
  • 5
    О, хорошо. Таким образом, это только удачей, что я установил свое имя хоста по умолчанию, debian. –  tshepang 30.03.2011, 01:29

Если Вы не можете или не хотеть использовать файл версии LSB (из-за зависимостей, пакет вводит), можно искать определенные для дистрибутива файлы версии. Bcfg2 имеет датчик для дистрибутива, который Вы смогли использовать: http://trac.mcs.anl.gov/projects/bcfg2/browser/doc/server/plugins/probes/group.txt

2
27.01.2020, 19:28

2 пути от многих:

1) использовать

lsb_release -a

Я протестировал его на CentOS 5.5 и Ubuntu 10.04

вывод для CentOS:

LSB Version:    :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch 
Distributor ID: CentOS
Description:    CentOS release 5.5 (Final)
Release:        5.5
Codename:       Final

и поскольку Ubuntu:

LSB Version:    :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description:    CentOS release 5.5 (Final)
Release:        5.5
Codename:       Final

2) введите следующую команду:

cat /etc/*-release

Я протестировал его на CentOS 5.5 и Ubuntu 10.04, и это хорошо работает.

1
27.01.2020, 19:28
  • 1
    lsb_release не находится в CentOS 6 (минуты устанавливают fwiw) –  a coder 08.10.2013, 18:34
  • 2
    lsb_release-a возвращается "-удар: lsb_release: команда, не найденная" на Малине с Raspbian (полученный Debian 7.1). –  Peter Mortensen 05.06.2014, 14:34
  1. lsb -* не установлен/, существуют в основных системах CentOS или Debian
  2. /proc /* не существует на OSX

Возьмите подсказку от разработчиков JavaScript. Не тестируйте на версию, тест для возможности. Это не симпатично, но это работает. Расширьтесь по мере необходимости.

function os_type
{
case `uname` in
  Linux )
     LINUX=1
     which yum && { echo centos; return; }
     which zypper && { echo opensuse; return; }
     which apt-get && { echo debian; return; }
     ;;
  Darwin )
     DARWIN=1
     ;;
  * )
     # Handle AmgiaOS, CPM, and modified cable modems here.
     ;;
esac
}  
9
27.01.2020, 19:28
  • 1
    Конфеткой мог очень хорошо быть Red Hat, Научный Linux или Fedora. Была способная команда для Fedora, имитирующего Debian. И так далее. Просто классифицировав что-либо с конфеткой, поскольку CentOS дает Вам диапазон поддерживаемых систем от Red Hat 4 к Fedora 18, который составляет приблизительно 8 лет истории Linux тут же. Если необходимо знать, поддерживается ли <нечто>, конкретно проверьте на <нечто> вместо того, чтобы предположить на основе (ненадежной) идентификации распределения! Несомненно, это приводит к чему-то вроде рода автоинструментов, но этому нельзя помочь (просто благодарность $DEITY, что войны Unix закончены). –  vonbrand 18.01.2013, 05:21
  • 2
    @vonbrand действительно, это - как Вы говорите. я не пытаюсь дифференцироваться между подароматами. и порядок, в котором я регистрируюсь (надо надеяться), удаляет большинство щекотливых ситуаций (RHEL с Кв. - установлен), хотя я не проводил большое исследование. если RHEL может иметь склонный - установлены, и у пользователей Ubuntu есть конфетка... хорошо, Вы - просто удар не повезло. –  Orwellophile 22.01.2013, 04:40

Эти работы сценария над Debian, (возможно, нуждается в некоторой тонкой настройке на Ubuntu),

#!/usr/bin/env bash

echo "Finding Debian/ Ubuntu Codename..."

CODENAME=`cat /etc/*-release | grep "VERSION="`
CODENAME=${CODENAME##*\(}
CODENAME=${CODENAME%%\)*}

echo "$CODENAME"
# => saucy, precise, lucid, wheezy, squeeze
0
27.01.2020, 19:28

Эта команда работает для распределения на основе Debian и Redhat: Использование фильтра TR , вы преобразуете документ в формат One-Word-Per-Line, а затем подсчитаете первую строку, которая содержит имя распределения.

tr -s ' \011' '\012' < /etc/issue | head -n 1
-4
27.01.2020, 19:28
python -m platform

Образец выходов:

Ubuntu:

Linux-4.9.184-linuxkit-x86_64-with-Ubuntu-18.04-bionic

Debian:

Linux-4.14.117-grsec-grsec+-x86_64-with-debian-buster-sid

CentOS:

Linux-3.10.0-957.1.3.el7.x86_64-x86_64-with-centos-7.6.1810-Core

Mac OS X:

Darwin-17.7.0-x86_64-i386-64bit

см. Документы модуля платформы Если вам нужно определенное значение из этой строки. Например, если вам нужно только имя Linux Distro, используйте

python -c "import platform;print(platform.linux_distribution()[0])"
13
27.01.2020, 19:28

Без версии, только dist:

cat /etc/issue | head -n +1 | awk '{print $1}'
-1
27.01.2020, 19:28

Вот моя простая версия chech_distro. ^^;

#!/usr/bin/env bash
check_distro2(){
    if [[ -e /etc/redhat-release ]]
    then
      DISTRO=$(cat /etc/redhat-release)
    elif [[ -e /usr/bin/lsb_release ]]
    then
      DISTRO=$(lsb_release -d | awk -F ':' '{print $2}')
    elif [[ -e /etc/issue ]]
    then
      DISTRO=$(cat /etc/issue)
    else
      DISTRO=$(cat /proc/version)
    fi
    }

    check_distro2
    echo $DISTRO
-1
27.01.2020, 19:28

Это было проверено на Ubuntu 14 и CentOS 7

cat /etc/os-release | grep "PRETTY_NAME" | sed 's/PRETTY_NAME=//g' | sed 's/["]//g' | awk '{print $1}'
-1
27.01.2020, 19:28

Для большинства современных ОС Linux файл / etc / os-release действительно становится стандартным и включается в большинство ОС. Таким образом, внутри вашего сценария Bash вы можете просто включить файл, и у вас будет доступ ко всем переменным, описанным здесь (например: NAME, VERSION, ...)

Я просто использую это в моем сценарии Bash:

if [ -f /etc/os-release ]
then
        . /etc/os-release
else
        echo "ERROR: I need the file /etc/os-release to determine what my distribution is..."
        # If you want, you can include older or distribution specific files here...
        exit
fi
5
27.01.2020, 19:28

Я используюscreenfetchскриптовую утилиту:

enter image description here

-2
27.01.2020, 19:28

Я нашел хороший скрипт отсюда, который работает для большинства распространенных дисков linux:

#! /bin/bash
# return an awkable string consisting of
#    unix OS type, or
#    Linux dist, or
#    a long guess (based on /proc), or
#    no clue

giveUp () {
   echo "Unknown"
   exit 0
}

# keep this easily awkable, prepending an initial clue
versionGuess () {
   if [ -e /proc/version ]; then
      echo -n "Unsure "
      cat /proc/version
      exit 0
   fi
   return 1
}

# if we have ignition, print and exit
gotDist () {
   [ -n "$1" ] && echo "$1" && exit 0
}

# we are only interested in a single word "dist" here
# various malformations can occur; admin will have to code appropately based on output
linuxRelease () {
   if [ -r /etc/lsb-release ]; then
      dist=$(grep 'DISTRIB_ID' /etc/lsb-release | sed 's/DISTRIB_ID=//' | head -1)
      gotDist "$dist"
   fi

   dist=$(find /etc/ -maxdepth 1 -name '*release' 2> /dev/null | sed 's/\/etc\///' | sed 's/-release//' | head -1)
   gotDist "$dist"

   dist=$(find /etc/ -maxdepth 1 -name '*version' 2> /dev/null | sed 's/\/etc\///' | sed 's/-version//' | head -1)
   gotDist "$dist"

   return 1
}

# start with uname and branch the decision from there
dist=$(uname -s 2> /dev/null)
if [ "$dist" = "Linux" ]; then
   linuxRelease
   versionGuess
   giveUp
elif [ -n "$dist" ]; then
   echo "$dist"
   exit 0
else
   versionGuess
   giveUp
fi

# we shouldn't get here
giveUp
# done
0
20.08.2021, 13:38

Если кому-то тоже нужен дистрибутив:

#!/usr/bin/env bash

LINUX_VERSION_NAME=`lsb_release -sr`


# Distribution specific installation
if [[ ${LINUX_VERSION_NAME} == "18.04" ]]
then
    echo "It is: ${LINUX_VERSION_NAME}"

else
    echo "It is not ${LINUX_VERSION_NAME}"
fi

Выход:

It is: 18.04

Измените на :младший бит _релиз -sc, чтобы получить дистрибутив:

LINUX_VERSION_NAME=`lsb_release -sc`


# Distribution specific installation
if [[ ${LINUX_VERSION_NAME} == "bionic" ]]
then
    echo "It is: ${LINUX_VERSION_NAME}"

else
    echo "It is not ${LINUX_VERSION_NAME}"
fi

Выход:

It is: bionic
-1
20.08.2021, 13:38

Поскольку в вопросе не указано ограничение на /bin/sh и т. д., существует решение с интерпретатором оболочки ruby ​​.

Существуетfacterruby ​​gem, который предоставляет некоторые сведения об ОС, анализирует файлы версии ОС, другие данные и выводит их на экран терминала. Вы можете попробовать следующее, начиная с установки rubygems:

# apt-get install ruby rubygems

Пожалуйста, используйте вариант выше, подходящий для вашей ОС. Затем установите сам драгоценный камень.

# gem install facter

Затем используйте:

$ facter

ПРИМЕЧАНИЕ. :Для получения дополнительной информации об установке см. исходники драгоценных камней Facter.

-1
20.08.2021, 13:38

Некоторые дистрибутивы используют файлы выпуска *-, некоторые используют версию *-, некоторые используют выпуск *-или любую комбинацию этих трех вариантов. Грязный и грязный путь:

[root@radio ~]# for file in /etc/{*issue*,*version*,*release*}; do [[ -f $file ]] || continue; echo -- $file; cat $file; done;
-- /etc/issue
\S
Kernel \r on an \m

-- /etc/issue.net
\S
Kernel \r on an \m
-- /etc/centos-release
CentOS Linux release 7.9.2009 (Core)
-- /etc/centos-release-upstream
Derived from Red Hat Enterprise Linux 7.8 (Source)
-- /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

-- /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
-- /etc/system-release
CentOS Linux release 7.9.2009 (Core)
-- /etc/system-release-cpe
cpe:/o:centos:centos:7
[root@radio ~]#
0
20.08.2021, 13:38

Теги

Похожие вопросы