Como obter o nome de código completo da distribuição do Ubuntu?

27
$ 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"

As saídas dos comandos acima mostram apenas o nome parcial do código (por exemplo, trusty ). Como obtenho o codinome completo ( trusty tahr ) do meu sistema Ubuntu instalado?

    
por Avinash Raj 19.04.2014 / 06:27

7 respostas

39

Não usando ferramentas externas:

Você pode apenas source (o comando source é um ponto . ) o /etc/os-release e você terá acesso a todas as variáveis definidas lá:

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

Editar. Se você quiser remover a parte 14.04, (como solicitado por terdon), você pode:

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

Observe que isso é um pouco desajeitado, já que em outras distribuições, o campo VERSION pode ter um formato diferente. Por exemplo, no meu debian,

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

Então, você pode imaginar algo assim (em um script):

#!/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
    
por gniourf_gniourf 19.04.2014 / 12:41
7

Minha variante do que já é oferecido:

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

A resposta mais curta e mais atrevida até à data.

Se você não se importa em carregar o conteúdo de /etc/os-release em seu ambiente atual, pode fingir que está carregando um script com bastante facilidade:

bash <(cat /etc/os-release; echo 'echo ${VERSION/*, /}')
    
por Oli 19.04.2014 / 13:17
5

Grep:

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

Explicação:

  • lsb_release -rs - > Imprime a sua versão do Ubuntu instalada.

  • grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info - > Pegue todas as linhas que contém sua versão, no meu caso é 14.04.

  • grep -m 1 "Description: Ubuntu " - > Mais uma vez agarra apenas a primeira linha correspondente (devido a -m flag) que contém a cadeia Description: Ubuntu .

  • cut -d "'" -f2 - > imprime o campo número 2 de acordo com aspas simples do delimitador '

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

Explicação:

Declarar e atribuir Variável no awk é feito através do parâmetro -v . Assim, o valor do comando lsb_release -rs é atribuído à variável var , o que ajuda a imprimir o campo 4, o campo 5 das linhas contém a string 14.04 e existe se encontrou um. Finalmente, o comando cut ajuda a remover as aspas simples.

    
por Avinash Raj 19.04.2014 / 06:27
4

O comando que você está procurando é:

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

Isso é muito feio e não otimizado. Tenho certeza que deve haver um método mais fácil e isso tem alguns problemas.

    
por Braiam 19.04.2014 / 06:38
1
. /etc/os-release 
echo $VERSION
    
por MegaBrutal 19.04.2014 / 12:55
1

Aqui estão mais algumas opções. Todos eles analisam o arquivo /etc/os-release que, no meu 13.10, se parece com isto:

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

Todas as soluções abaixo analisarão a segunda linha para produzir Saucy Salamander .

  1. grep

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

    O -o significa "imprimir apenas a parte correspondente da linha" e o -P ativa Expressões regulares compatíveis com Perl. Isso nos permite usar \K , que descarta o que foi correspondido até aquele ponto, que combinado com -o significa "imprimir somente o que corresponde a após o \K . Assim, a expressão regular real usada corresponde as duas últimas palavras de uma linha que contém VERSION= .

  2. awk

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

    Definir o separador de campos como " e space significa que os campos 3d e 4rth da linha que contém VERSION= são a string que procuramos.

  3. sed

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

    A chave -n suprime a saída normal, nenhuma linha será impressa. O -r permite expressões regulares estendidas. Em seguida, nas linhas que correspondem a VERSION= , excluiremos tudo, exceto as duas últimas palavras. O p no final significa impressão.

  4. perl

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

    O -n significa 'processar cada linha de entrada com o script dado por -e ". O -l adiciona um caractere de nova linha a cada chamada impressa (e algumas outras coisas que não são relevantes aqui). corresponde às duas últimas palavras ( \b é um limite de palavras) e as imprime se a linha contiver VERSION= .

  5. coreutils

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

    Aqui, apenas grep da linha relevante e usamos cut definindo o separador de campo como space ( -d ' ' ) e imprimindo tudo do 2º campo até o final da linha. O comando tr -d excluirá o " do final.

  6. Concha pura (roubar descaradamente a idéia inteligente de source do @ gniourf_gniourf):

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

    O . origina o arquivo que torna as variáveis disponíveis para o shell e eu uso o bash recursos de manipulação de strings para remover os números de versão.

por terdon 19.04.2014 / 12:27
1

Usando o regex, você pode fazer isso:

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

Explicação:

Isso pesquisa a linha com VERSION no arquivo /etc/os-release . Em seguida, ele encontra 2 palavras sucessivas separadas por um espaço (regex Perl). O sinalizador -o mantém apenas o que corresponde à pesquisa.

Você precisa usar [a-zA-Z] em vez de 'w' para evitar a inclusão de dígitos.

    
por Romain Vincent 29.10.2017 / 22:34