Як отримати кодове ім'я Debian без lsb-релізу


15

Я намагаюся створити сценарій, який вимагає від мене надрукувати кодове ім'я debian, щоб я міг повторити його у файл source.list.

Я намагаюся змусити цей скрипт працювати в будь-якій версії Debian, тому я сподівався встановити змінну bash кодового імені випуску. Це було б легко зробити (з lsb_release -c), однак наші зображення розгортання не містять lsb_release за замовчуванням - і з цим сценарієм потрібно виправити source.list, установка lsb-release з apt-get не буде варіантом .

Я знайшов численні способи отримати номер випуску та іншу інформацію про систему, але не можу знайти надійне місце для отримання кодового імені.

Будь-які ідеї будуть дуже вдячні!

(ОС, з якою я тестую це Debian Squeeze)


1
Якщо ви lsb_releaseпереглянули це питання, розглядаючи його вихідний код , перевірте, чи готові ви винаходити все це
aexl

Відповіді:


20

Ви можете використовувати /etc/os-release:

(
  . /etc/os-release
  printf '%s\n' "$VERSION"
)
7 (wheezy)

10

видавлювання не поставляється з /etc/os-release, це мій "злом":

dpkg --status tzdata|grep Provides|cut -f2 -d'-'

Юо, брато. Це хвора! Саме те, що мені було потрібно. Ніщо інше в Linux Mint LMDE (Debian Edition) не відображає версію Debian, на якій була створена Монетний двір. Але ваше рішення робить. Спасибі!
Гтодоров

5

Ви можете надрукувати код разом із номером версії debian:

root@debian:/home/mohsen# grep "VERSION=" /etc/os-release |awk -F= {' print $2'}|sed s/\"//g
8 (jessie)

АБО ви можете оголити своє кодове ім'я з числа та прантезу:

grep "VERSION=" /etc/os-release |awk -F= {' print $2'}|sed s/\"//g |sed s/[0-9]//g | sed s/\)$//g |sed s/\(//g
jessie

Або, ідіоматичніше:awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
Jasonwryan

1
@jasonwryan Evenawk -F"[=\"]+" '/VERSION=/ {print $2}' /etc/os-release
Костас

@Costas мій вихід - лише кодове ім'я.
PersianGulf

4
Якщо ви хочете просто кодове ім'я, це дуже простоawk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
Costas

5

Ви можете отримати кодове ім'я дистрибутива Debian від /etc/os-release. Замість того, щоб намагатися проаналізувати цей файл, ви можете вивести його в нове середовище, щоб не впливати на ваше поточне середовище, і виконати echoкоманду в цьому новому середовищі.

env -i bash -c '. /etc/os-release; echo $VERSION_CODENAME'

Щоб розбити його:

  • env : Виконайте команду в новому середовищі.
  • -i : Не успадковуйте змінні середовища від існуючого середовища.
  • bash : Запустіть bash, щоб у нас була оболонка для джерела файлу os-release та для виконання команди echo.
  • -c: Скажіть, що bashми хочемо виконати команду, а не запускати інтерактивну оболонку.
  • . /etc/os-release: Джерело вмісту os-releaseнашого нового середовища. os-releaseмістить кілька рядків, що задають змінні середовища, і це встановить ці змінні середовища в нашому новому середовищі.
  • ; : Відокремте цю команду і запустіть наступну команду.
  • echo $VERSION_CODENAME: Відлучіть кодове ім'я, яке було встановлено os-releaseфайлом.

1
Чудова відповідь, я навчив вас використовувати такі файли з нього. Я використовував це так, echo "$(. /etc/os-release && echo $VERSION_CODENAME"але помітив, що немає $VERSION_CODENAMEв stretch. Дуже сумна новина.
Хімура

2
Я це виправив так, echo "$(. /etc/os-release && echo ${VERSION_CODENAME-stretch})"що здається моїм завданням нормальним, але це виглядає погано
Хімура

1
Це виглядає як найелегантніший підхід (принаймні, завдяки участі в розборі)
aexl

2

Для системних:

hostnamectl | grep "Operating System"

вихід:

  Operating System: Debian GNU/Linux 8 (jessie)

Це працює для мене.
AnthonyB

Це, безумовно, не працює на Debian Squeeze, оскільки Debian Squeeze не мав системного пакету. І навіть з Debian 8 Jessie (де systemd став системою init за замовчуванням), hostnamectl встановлюється лише при встановленні systemd, тому це рішення не працюватиме, якщо система, про яку йде мова, використовує одну з інших 3 або 4 систем init, які пропонує Debian.
Аксель Беккерт

0

Ще одна евристика - це побачити, звідки беруться пакети для поточно працюючої ОС.

Простий (і, ймовірно, схильний до помилок) варіант:

fgrep -r /debian/ /etc/apt/sources.list \
    | egrep -v '^ *#' \
    | awk '{print $3}' \
    | egrep -v '[-/]'  \
    | uniq

Більш надійний спосіб - проаналізувати деталі з виводу apt-cache policy(без додаткових параметрів):

apt-cache policy \
    | fgrep o=Debian, \
    | fgrep ,l=Debian, \
    | fgrep ,c=main, \
    | awk -F '[,=]' '{print $6}'

apt-cache policyперераховані всі сховища APT, які використовуються в локальній системі. Ми фільтруємо ті, що походять від Debian, які позначені як раз Debian(тобто не ті, що позначені, наприклад Debian debug), потім лише дивимося в основний архів (не contribабо non-free) і вибираємо відповідне значення.

Ще стабільнішим підходом було б не покладатися на порядок елементів і знаходити n=значення в рядку, що залишився:

apt-cache policy \
    | fgrep o=Debian, \
    | fgrep ,l=Debian, \
    | fgrep ,c=main, \
    | egrep -o 'n=[^, ]*' \
    | awk -F= '{print $2}'

Ще одна можливість полягає в тому, щоб розібрати /var/lib/apt/lists/*Releaseфайли самостійно, а не дозволяти apt-cacheцьому:

egrep -l '^Origin: Debian$' /var/lib/apt/lists/*Release \
    | xargs egrep -l '^Label: Debian$' \
    | xargs egrep -L 'Codename: .*-' \
    | xargs fgrep Codename \
    | awk '{print $2}'

0

Мені потрібно було додати якусь URL-адресу в source.list. І щоб мати можливість динамічно поставити ім'я версії коду, я використовую цей шматок коду (покладатися на те , що кодове ім'я в дужках): Натхненний @PersianGulf відповідь .

grep "VERSION=" /etc/os-release |awk -F= {' print tolower($2)'}|sed s/\.*\(//g | sed s/" ".*\"//g


0

Розширюючись на відповідь @Costas , ця команда не працювала 16.04, де вона повертала повне ім'я "Xerial Xerus", але я хотіла лише "xerial", оскільки саме так репо, що я намагався витягнути, відокремили різні версії. Ця команда додає, що повернеться лише перше слово, і що це буде все маленьке:

awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release | awk '{print $1}' | awk '{ print tolower($0) }'

Це працює і для "Джессі"


0

Тільки з використанням grep:

grep -Po 'VERSION="[0-9]+ \(\K[^)]+' /etc/os-release

Спробуйте (вихід на момент написання цієї публікації):

$ docker run --rm debian:stable-slim grep -Po 'VERSION="[0-9]+ \(\K[^)]+' /etc/os-release
stretch

0

це може бути (а може і не бути) альтернативним підходом до того, що bcoca написав на Debian видавленні - я перевірив його Ubuntu 18.04:

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