Для узкого определения файла:
find . -maxdepth 1 -type f | wc -l
Добираться 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
но конечно Вам решать
Если файл /etc/debian_version
существует, распределением является Debian или производная Debian. Этот файл может иметь номер выпуска; на моей машине это в настоящее время 6.0.1
. Если это тестирует или нестабильное, это может сказать, что тестирование / нестабильный, или может иметь количество предстоящего выпуска. Мое впечатление - то, что на Ubuntu, по крайней мере, этот файл всегда является тестированием / нестабильный, и что они не помещают номер выпуска в него, но кто-то может исправить меня, если я неправ.
Fedora (недавние выпуски, по крайней мере), имейте подобный файл, а именно, /etc/fedora-release
.
/etc/debian_version
и /etc/os-release
.
– Faheem Mitha
24.03.2015, 22:17
/etc/debian_version
файл. Таким образом, способ, которым мы готовим установку Debian, мог влиять на доступные файлы версии, это интересно.
– Dereckson
28.03.2015, 12:05
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 и возможно другие.
cat /etc/*version
не работает (нет такого файла) на CentOS (по крайней мере, на 6,4)
– om-nom-nom
23.10.2013, 15:32
Острота, нейтрализации, одна строка вывода, никаких ошибок.
( lsb_release -ds || cat /etc/*release || uname -om ) 2>/dev/null | head -n1
lsb_release -a
. Работы над Debian и я предполагаю Ubuntu, но я не уверен в остальных. Обычно это должно существовать во всем GNU/дистрибутивах Linux, так как это - LSB (Основа Стандарта Linux) связанный.
Я пошел бы с этим как первый шаг:
ls /etc/*release
Хинду, RedHat, Arch & SuSE назвали файл, например. /etc/gentoo-release
. Кажется, популярен, проверяет этот сайт о файлах версии.
Debian & Ubuntu должна иметь a /etc/lsb-release
который содержит информацию о выпуске также и обнаружится с предыдущей командой.
Другой быстрый uname -rv
. Если установленное ядро будет ядром дистрибутива запаса, то Вы будете обычно иногда находить имя там.
uname -rv
содержать информацию хотя? uname -a
распечатает вещи как тип процессора и имени хоста, которые не важны здесь. (Но оба выпуска ядра (-r
) и версия (-v
) необходимы, не, все дистрибутивы делают это то же там),
– Mat
29.03.2011, 23:34
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
uname -a
-n
, т.е. nodename == имя хоста. таким образом, я сказал бы uname
не будет интересно на Debian. Задумайтесь о нем, я не уверен, что это настолько полезно на Redhat также.
– Mat
30.03.2011, 01:26
debian
.
– tshepang
30.03.2011, 01:29
Если Вы не можете или не хотеть использовать файл версии LSB (из-за зависимостей, пакет вводит), можно искать определенные для дистрибутива файлы версии. Bcfg2 имеет датчик для дистрибутива, который Вы смогли использовать: http://trac.mcs.anl.gov/projects/bcfg2/browser/doc/server/plugins/probes/group.txt
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, и это хорошо работает.
Возьмите подсказку от разработчиков 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
}
Эти работы сценария над 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
Эта команда работает для распределения на основе Debian и Redhat:
Использование фильтра TR
, вы преобразуете документ в формат One-Word-Per-Line, а затем подсчитаете первую строку, которая содержит имя распределения.
tr -s ' \011' '\012' < /etc/issue | head -n 1
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])"
#!/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
Это было проверено на Ubuntu 14 и CentOS 7
cat /etc/os-release | grep "PRETTY_NAME" | sed 's/PRETTY_NAME=//g' | sed 's/["]//g' | awk '{print $1}'
Для большинства современных ОС 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
Я нашел хороший скрипт отсюда, который работает для большинства распространенных дисков 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
Если кому-то тоже нужен дистрибутив:
#!/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
Поскольку в вопросе не указано ограничение на /bin/sh и т. д., существует решение с интерпретатором оболочки ruby .
Существуетfacterruby gem, который предоставляет некоторые сведения об ОС, анализирует файлы версии ОС, другие данные и выводит их на экран терминала. Вы можете попробовать следующее, начиная с установки rubygems:
# apt-get install ruby rubygems
Пожалуйста, используйте вариант выше, подходящий для вашей ОС. Затем установите сам драгоценный камень.
# gem install facter
Затем используйте:
$ facter
ПРИМЕЧАНИЕ. :Для получения дополнительной информации об установке см. исходники драгоценных камней Facter.
Некоторые дистрибутивы используют файлы выпуска *-, некоторые используют версию *-, некоторые используют выпуск *-или любую комбинацию этих трех вариантов. Грязный и грязный путь:
[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 ~]#
-
и_
? Возможно, это находится в/lib/lsb
или где-нибудь как этот. Что делаетrpm -qa "lsb*"
печать? – Mikel 24.01.2011, 07:56rpm -qa "lsb*
печать ничто. Согласноyum provides */lsb_release
это содержится в пакете, названном redhat-lsb, который я предполагаю, не установлен по умолчанию. Однако я не эксперт по Fedora, это просто результаты случайного Fedora VM, который я имею и мог быть очень неправым. – Steven D 24.01.2011, 08:01lsb-release
, поскольку Вы сказали. – Mikel 24.01.2011, 08:07$OS
,$VERSION
, и т.д. - условно, мы используем для своей выгоды переменные среды (ПЕЙДЖЕР, РЕДАКТОР, ОБОЛОЧКА...) и внутренние переменные оболочки (BASH_VERSION, СЛУЧАЙНЫЙ...). Все другие имена переменной должны содержать по крайней мере одну строчную букву. Эта конвенция старается не случайно переопределять переменные окружения и внутренние переменные. – Chris Down 16.09.2011, 23:18