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

33
$ lsb_release -c
Codename:   trusty

$ cat /etc/issue
Ubuntu 14.04 LTS \n \l

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS"

Выходные данные вышеупомянутых команд показывают только частичное кодовое имя (то есть, trusty). Как получить полное кодовое имя ( trusty tahr ) моей установленной системы Ubuntu?

Авинаш Радж
источник
1
Похоже, что есть процесс конвергенции к поиску файла /etc/os-release. Может быть, вы должны указать, что вы подразумеваете под Как получить полное кодовое имя (trusty tahr) моей установленной системы Ubuntu? , Вы хотите, чтобы он отображался только на терминале, или вам нужно, чтобы он был назначен переменной? Будет ли это использоваться на некоторых не-Ubuntu, Debian} системах?
gniourf_gniourf

Ответы:

43

Не используя никаких внешних инструментов:

Вы можете просто использовать источник (команда source является точкой .), /etc/os-releaseи у вас будет доступ ко всем переменным, определенным там:

$ . /etc/os-release
$ echo "$VERSION"
14.04, Trusty Tahr

Редактировать. Если вы хотите удалить 14.04,деталь (как попросил тердон), вы можете:

$ . /etc/os-release
$ read _ UBUNTU_VERSION_NAME <<< "$VERSION"
$ echo "$UBUNTU_VERSION_NAME"
Trusty Tahr

Обратите внимание, что это немного неуклюже, так как в других дистрибутивах VERSIONполе может иметь другой формат. Например, на моем Debian,

$ . /etc/os-release
$ read _ UBUNTU_VERSION_NAME <<< "$VERSION"
$ echo "$UBUNTU_VERSION_NAME"
(wheezy)

Затем вы можете представить что-то вроде этого (в сценарии):

#!/bin/bash

if [[ -r /etc/os-release ]]; then
    . /etc/os-release
    if [[ $ID = ubuntu ]]; then
        read _ UBUNTU_VERSION_NAME <<< "$VERSION"
        echo "Running Ubuntu $UBUNTU_VERSION_NAME"
    else
        echo "Not running an Ubuntu distribution. ID=$ID, VERSION=$VERSION"
    fi
else
    echo "Not running a distribution with /etc/os-release available"
fi
gniourf_gniourf
источник
1
(эхо является встроенной) , но хорошо, как об этом: . /etc/os-release && echo ${VERSION//[0-9,. ]/ }?
Terdon
1
@terdon есть более чем один способ снять шкуру с кошки ;D.
gniourf_gniourf
Что случилось со всеми комментариями здесь?
gniourf_gniourf
2
Их много, а ваш особенно хорош! Комментарии, которые не имеют отношения к фактическому ответу, могут быть удалены без предупреждения.
тердон
8

Мой вариант того, что уже предложено:

. /etc/os-release; echo ${VERSION/*, /}

Самый короткий, самый быстрый ответ на сегодняшний день.

Если вам не нужно загружать /etc/os-releaseсодержимое в текущую среду, вы можете подделать bash, думая, что он загружает скрипт довольно легко:

bash <(cat /etc/os-release; echo 'echo ${VERSION/*, /}')
Оли
источник
3
Как ты смеешь говорить bashier, чем что-либо еще на сегодняшний день ? здесь есть и другие полные ответы bash :D.
gniourf_gniourf
Почему отрицательный голос? это хороший ответ (хотя концептуально ничем не отличается от того, что было дано до него).
gniourf_gniourf
2
Хех, умное использование процесса подстановки, +1.
тердон
как и следовало ожидать от мастера @terdon :)
Rinzwind
1
Простую подоболочку тоже можно сделать ( . /etc/os-release && echo ${VERSION/*, /} ).
gniourf_gniourf
5

Grep:

$ grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info | grep -m 1 "Description: Ubuntu " | cut -d "'" -f2
Trusty Tahr

Объяснение:

  • lsb_release -rs -> Печатает установленную версию Ubuntu.

  • grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info -> Возьмите все строки, которые содержат вашу версию выпуска, в моем случае это 14.04.

  • grep -m 1 "Description: Ubuntu "-> Снова получает только соответствующую первую строку (из-за -mфлага), которая содержит строку Description: Ubuntu.

  • cut -d "'" -f2 -> печатает поле № 2 в соответствии с одинарной кавычкой разделителя '

Awk:

$ awk -v var=$(lsb_release -rs) '$3~var {print $4" "$5;exit;}' /usr/share/python-apt/templates/Ubuntu.info | cut -d"'" -f2
Trusty Tahr

Объяснение:

Объявление и присвоение переменной в awk осуществляется через -vпараметр. Так что значение lsb_release -rs команды присваивается переменной, varкоторая inturn помогает печатать поле 4, поле 5 из строк содержит строку 14.04и существует, если она найдена. Наконец, cutкоманда помогает удалить одинарные кавычки.

Авинаш Радж
источник
4

Команда, которую вы ищете:

grep -oP '(?<=VERSION\=\"(\d\d)\.(\d\d)\,\ )(.*?)(?="$)' /etc/os-release

Это очень некрасиво и не оптимизировано. Я уверен, что должен быть более простой метод, и это имеет некоторые проблемы.

Braiam
источник
1
. /etc/os-release 
echo $VERSION
MegaBrutal
источник
3
Вам все еще нужно удалить цифры, см. Ответ @ gniourf_gniourf ниже, в котором используется точно такой же подход.
тердон
1

Вот еще несколько вариантов. Все они анализируют /etc/os-releaseфайл, который на моем 13.10 выглядит следующим образом:

NAME="Ubuntu"
VERSION="13.10, Saucy Salamander"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 13.10"
VERSION_ID="13.10"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

Все приведенные ниже решения будут анализировать вторую строку для производства Saucy Salamander.

  1. grep

    grep -oP 'VERSION=.* \K\w* \w*' /etc/os-release
    

    Это -oозначает «печатать только соответствующую часть строки» и -Pвключает Perl-совместимые регулярные выражения. Это позволяет нам использовать , \Kкоторый отбрасывает все , что было подобрано до той точки, которая в сочетании с -oпомощью «печатать только то , что соответствует после\K . Таким образом, фактическое регулярное выражение , используемое будет соответствовать два последних слова в строке , которая содержит VERSION=.

  2. awk

    awk -F'[" ]' '/VERSION=/{print $3,$4}'  /etc/os-release
    

    Установка разделителя полей в "и spaceозначает, что 3-е и 4-е поля строки, содержащей, VERSION=являются строкой, за которой мы следуем .

  3. sed

    sed -nr '/VERSION=/{s/.* (\w* \w*)"/\1/;p}' /etc/os-release
    

    В -nпереключателе подавляет нормальный выход, никаких линий не будут напечатаны. -rПозволяет расширенные регулярные выражения. Затем в совпадающих строках VERSION=мы удалим все, кроме двух последних слов. В pконце означает печать.

  4. perl

    perl -lne '/VERSION=.*\b(\w+ \w+)/ && print $1' /etc/os-release
    

    -nПроцесс означает»каждый линейный вход со сценарием , заданным -e». -lДобавляет символ новой строки к каждому печати вызову (и некоторым другим вещам , которые не являются relevevant здесь). Регулярное выражение соответствует последнему два слова ( \bграничное слово) и печатает их, если строка содержит VERSION=.

  5. Coreutils

    grep VERSION= /etc/os-release | cut -d ' ' -f 2-  | tr -d '"' 
    

    Здесь мы просто берем grepсоответствующую строку и используем cutустановку разделителя полей на space( -d ' ') и выводим все, начиная со 2-го поля и до конца строки. Команда tr -dудалит "с конца.

  6. Чистая оболочка (бесстыдно крадет умную sourceидею @ gniourf_gniourf ):

    . /etc/os-release && echo ${VERSION//[0-9,. ]/ }
    

    Исходный .код - файл, который делает переменные доступными для оболочки, и я использую возможности манипулирования строками в bash для удаления номеров версий.

terdon
источник
1

Используя регулярные выражения, вы можете сделать это:

grep 'VERSION' /etc/os-release | grep -oP "[a-zA-Z]+ [a-zA-Z]+"

Объяснение:

Это ищет строку с VERSIONв файле /etc/os-release. Затем он находит 2 последовательных слова, разделенных пробелом (регулярное выражение Perl). Флаг -o содержит только то, что соответствует поиску.

Вы должны использовать [a-zA-Z]вместо `w`, чтобы не включать цифры.

Ромэн Винсент
источник