Jak uzyskać pełną nazwę kodową dystrybucji 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"

Dane wyjściowe powyższych poleceń pokazują tylko częściową nazwę kodową (tj trusty.). Jak uzyskać pełną kryptonim ( zaufany tahr ) mojego zainstalowanego systemu Ubuntu?

Avinash Raj
źródło
1
Wygląda na to, że proces pozyskiwania pliku jest zbieżny /etc/os-release. Może powinieneś sprecyzować, co masz na myśli? Jak uzyskać pełną kryptonim (zaufany tahr) mojego zainstalowanego systemu Ubuntu? . Czy chcesz echo tylko na terminalu, czy potrzebujesz przypisania do zmiennej? Czy będzie to stosowane w niektórych systemach innych niż {Ubuntu, Debian}?
gniourf_gniourf

Odpowiedzi:

43

Bez użycia narzędzi zewnętrznych:

Możesz po prostu źródło (polecenie źródła to kropka .) /etc/os-releasei będziesz mieć dostęp do wszystkich zdefiniowanych tam zmiennych:

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

Edytować. Jeśli chcesz usunąć 14.04,część (jak poprosił terdon), możesz:

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

Zauważ, że jest to nieco niezręczne, ponieważ w innych dystrybucjach VERSIONpole może mieć inny format. Na przykład na moim debianie

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

Następnie możesz sobie wyobrazić coś takiego (w skrypcie):

#!/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
źródło
1
(echo jest wbudowane), ale OK, a co z tym . /etc/os-release && echo ${VERSION//[0-9,. ]/ }:?
terdon
1
@terdon jest więcej niż jeden sposób na skórowanie kota ;D.
gniourf_gniourf
Co się stało z wszystkimi komentarzami tutaj?
gniourf_gniourf
2
Jest ich wiele, a twój jest szczególnie dobry! Komentarze, które nie mają związku z rzeczywistą odpowiedzią, można usunąć bez ostrzeżenia.
terdon
8

Mój wariant tego, co już jest oferowane:

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

Najkrótsza, najstraszniejsza jak dotąd odpowiedź.

Jeśli nie chcesz ładować /etc/os-releasezawartości do obecnego środowiska, możesz udawać, że bash myśli, że ładuje skrypt dość łatwo:

bash <(cat /etc/os-release; echo 'echo ${VERSION/*, /}')
Oli
źródło
3
Jak śmiesz mówić bardziej wstydliwie niż cokolwiek innego do tej pory ? są tutaj inne pełne odpowiedzi na bash :D.
gniourf_gniourf
Dlaczego głosowanie negatywne? to dobra odpowiedź (choć bez pod względem koncepcyjnym niczego innego niż inne podane przed nią).
gniourf_gniourf
2
Heh, sprytne użycie substytucji procesu, +1.
terdon
jak można oczekiwać od mistrza @terdon :)
Rinzwind
1
Prosty powłoki w tle by wykonać zadanie, a także: ( . /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

Wyjaśnienie:

  • lsb_release -rs -> Drukuje zainstalowaną wersję Ubuntu.

  • grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info -> Złap wszystkie linie, które zawierają twoją wersję wydania, w moim przypadku jest to 14.04.

  • grep -m 1 "Description: Ubuntu "-> Ponownie pobiera tylko dopasowany pierwszy wiersz (z powodu -mflagi), który zawiera ciąg Description: Ubuntu.

  • cut -d "'" -f2 -> drukuje pole numer 2 zgodnie z pojedynczym cudzysłowiem '

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

Wyjaśnienie:

Zadeklarowanie i przypisanie zmiennej w awk odbywa się za pomocą -vparametru, więc wartość lsb_release -rs polecenia jest przypisana do zmiennej, varktórej inturn pomaga wydrukować pole 4, pole 5 z wierszy zawiera ciąg znaków 14.04i istnieje, jeśli znaleziono jedno. Na koniec cutpolecenie pomaga usuń pojedyncze cudzysłowy.

Avinash Raj
źródło
4

Polecenie, którego szukasz, to:

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

Jest to bardzo brzydkie i niezoptymalizowane. Jestem pewien, że powinna istnieć łatwiejsza metoda, która ma pewne problemy.

Braiam
źródło
1
. /etc/os-release 
echo $VERSION
MegaBrutal
źródło
3
Nadal musisz usunąć liczby, zobacz odpowiedź @ gniourf_gniourf poniżej, która stosuje dokładnie to samo podejście.
terdon
1

Oto kilka innych możliwości. Wszystkie parsują /etc/os-releaseplik, który na moim 13.10 wygląda następująco:

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/"

Wszystkie poniższe rozwiązania przeanalizują drugą linię do wyprodukowania Saucy Salamander.

  1. grep

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

    Te -ośrodki „wydrukować tylko część dopasowanie linii”, a -Pumożliwia pcre. To pozwala nam korzystać \Kktóra usuwa co zostało dopasowane do tego punktu, co w połączeniu ze -ośrodkami „drukować tylko to, co pasuje po\K . Więc rzeczywiste wyrażenie regularne używane dopasuje dwa ostatnie słowa wiersza, który zawiera VERSION=.

  2. awk

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

    Ustawienie separatora pól na "i spaceoznacza, że ​​pola 3d i 4 wiersza zawierającego wiersz VERSION=są ciągiem, którego szukamy.

  3. sed

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

    Na -nnormalne wyjście sterujące tłumi żadne linie zostaną wydrukowane. -rPozwala rozszerzyć wyrażeń regularnych. Następnie w pasujących liniach VERSION=usuniemy wszystko oprócz dwóch ostatnich słów. Na pkońcu oznacza druk.

  4. perl

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

    Przez -nproces każda linia wejściowa ze skryptem dany za pomocą” -e”. Na -ldodaje znak nowej linii na każde wezwanie druku (i kilka innych rzeczy, które nie jest relevevant tutaj). Wyrażenie regularne mecze dwa ostatnie słowa ( \bjest granica słowo) i wypisuje je, jeśli linia zawiera VERSION=.

  5. coreutils

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

    Tutaj, po prostu grepodpowiednią linię i używamy cutustawienia separatora pól na space( -d ' ') i drukowania wszystkiego od drugiego pola do końca linii. tr -dPolecenie usunąć "od końca.

  6. Czysta skorupa (bezwstydnie kradnie sprytny sourcepomysł @ gniourf_gniourf ):

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

    Te .źródła plik, który sprawia, że zmienne dostępne do powłoki i używam Bash za możliwościami manipulacji ciąg usunąć numery wersji.

terdon
źródło
1

Używając wyrażenia regularnego możesz to zrobić:

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

Wyjaśnienie:

Przeszukuje linię z VERSIONpliku /etc/os-release. Następnie znajduje 2 kolejne słowa oddzielone spacją (wyrażenie regularne Perl). Flaga -o zachowuje tylko to, co pasuje do wyszukiwania.

Musisz użyć [a-zA-Z]zamiast „w”, aby uniknąć włączenia cyfr.

Romain Vincent
źródło