Як отримати повне кодове ім'я дистрибутива 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). Як я можу отримати повне кодове ім’я ( довірливий tahr ) встановленої системи Ubuntu?


1
Здається, що існує процес конвергенції щодо пошуку файлу /etc/os-release. Можливо, вам слід вказати, що ви маєте на увазі під яким способом отримати повне кодове ім’я (довірлий тахр) встановленої системи 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

1
(Відлуння є вбудованої) , але добре, як про це: . /etc/os-release && echo ${VERSION//[0-9,. ]/ }?
terdon

1
@terdon існує більше ніж один спосіб зібрати кота ;D.
gniourf_gniourf

Що сталося з усіма коментарями тут?
gniourf_gniourf

2
Їх багато, і ваша - особливо гарна! Коментарі, які не стосуються фактичної відповіді, можна видалити без попередження.
terdon

8

Мій варіант щодо того, що вже пропонується:

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

Найкоротша, Башист відповідь на сьогоднішній день.

Якщо ви не хочете завантажувати /etc/os-releaseвміст у своє поточне середовище, ви можете підробити думки про те, що він завантажує сценарій досить легко:

bash <(cat /etc/os-release; echo 'echo ${VERSION/*, /}')

3
Як ти наважишся сказати, що баші більше за все на сьогодні ? тут є інші повні відповіді :D.
gniourf_gniourf

Чому потік? це гарна відповідь (хоча нічим концептуально не відрізняється від інших, що були подані раніше).
gniourf_gniourf

2
Хе, розумне використання процесу заміщення, +1.
terdon

як можна було очікувати від майстра @terdon :)
Rinzwind

1
Проста подоболочка буде робити цю роботу , а також: ( . /etc/os-release && echo ${VERSION/*, /} ).
gniourf_gniourf

5

Греп:

$ 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яка вводить допомогу для друку поля 4, поле 5 з рядків містить рядок 14.04і існує, якщо її знайдено одна. Фінально cutкоманда допомагає видаліть єдині лапки.


4

Команда, яку ви шукаєте:

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

Це дуже некрасиво і не оптимізовано. Я впевнений, що має бути простіший метод, і це має деякі проблеми.


1
. /etc/os-release 
echo $VERSION

3
Вам все одно потрібно видалити цифри, див. Відповідь @ gniourf_gniourf нижче, що використовує абсолютно той самий підхід.
terdon

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 Compatible Regular Expressions. Це дозволяє нам використовувати , \Kякий відкидає всі , що було підібрано до тієї точки, яка в поєднанні з -oдопомогою «друкувати тільки те , що відповідає після\K . Таким чином, фактичне регулярний вираз , що використовується буде відповідати два останніх слова в рядку , яка містить VERSION=.

  2. awk

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

    Встановлення роздільника полів на "та spaceозначає, що 3d та 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Додає символ нового рядка до кожного виклику друку (та деякі інші речі, які тут не належні). Регулярний вираз відповідає двом останнім словам ( \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 рядки маніпуляції можливостей для видалення номера версій.


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`, щоб не включати цифри.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.