Como obter o nome de código completo da distribuição 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"

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

Avinash Raj
fonte
1
Parece que há um processo convergente para o fornecimento do arquivo /etc/os-release. Talvez você deva especificar o que você quer dizer com Como obtenho o nome de código completo (trusty tahr) do meu sistema Ubuntu instalado? . Você deseja repetir isso no terminal ou precisa que ele seja atribuído a uma variável? Isso será usado em alguns sistemas que não são o {Ubuntu, Debian}?
gniourf_gniourf

Respostas:

43

Usando nenhuma ferramenta externa:

Você pode apenas fonte (o comando fonte é um ponto .) /etc/os-releasee terá acesso a todas as variáveis ​​definidas lá:

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

Editar. Se você deseja remover a 14.04,peça (conforme 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, pois em outras distribuições, o VERSIONcampo 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
gniourf_gniourf
fonte
1
(o eco está embutido) mas tudo bem, e quanto a isso . /etc/os-release && echo ${VERSION//[0-9,. ]/ }:?
Terdon
1
@terdon há mais de uma maneira de esfolar um gato ;D.
gniourf_gniourf
O que aconteceu com todos os comentários aqui?
gniourf_gniourf
2
Existem muitos e o seu é particularmente bom! Comentários irrelevantes para a resposta real podem ser excluídos sem aviso prévio.
terdon
8

Minha variante do que já é oferecido:

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

A resposta mais curta e descarada até o momento.

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

bash <(cat /etc/os-release; echo 'echo ${VERSION/*, /}')
Oli
fonte
3
Como você ousa dizer mais tímido do que qualquer outra coisa até hoje ? existem outras respostas completas aqui :D.
Gnourf_gniourf
Por que o voto negativo? é uma boa resposta (embora sem nada conceitualmente diferente dos outros dados anteriormente).
gniourf_gniourf
2
Heh, uso inteligente da substituição do processo, +1.
terdon
como seria de esperar do @terdon mestre :)
Rinzwind
1
A subshell simples seria fazer o trabalho, bem como: ( . /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

Explicação:

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

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

  • grep -m 1 "Description: Ubuntu " -> Novamente pega apenas a primeira linha correspondente (por causa de -m bandeira) que contém a string Description: Ubuntu.

  • cut -d "'" -f2 -> imprime o número do campo 2 de acordo com a 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 -vparâmetro. Assim, o valor do lsb_release -rs comando é atribuído à variável varque inturn ajuda a imprimir o campo 4, o campo 5 das linhas contém a string 14.04e existe se for encontrado um.Finalmente, o cutcomando ajuda a remova as aspas simples.

Avinash Raj
fonte
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 de que deve haver um método mais fácil e isso tem alguns problemas.

Braiam
fonte
1
. /etc/os-release 
echo $VERSION
MegaBrutal
fonte
3
Você ainda precisa remover os números. Consulte a resposta de @ gniourf_gniourf abaixo, que usa exatamente a mesma abordagem.
terdon
1

Aqui estão mais algumas opções. Todos eles analisam o /etc/os-releasearquivo que, no meu 13.10, fica assim:

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 a ser produzida Saucy Salamander.

  1. grep

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

    O -omeio "imprime apenas a parte correspondente da linha" e -Phabilita expressões regulares compatíveis com Perl. Isso nos permite usar \Kquais descarta o que foi correspondido até esse ponto, que combinado com os -omeios "imprime apenas o que corresponde após o \K. Portanto, a expressão regular real usada corresponderá às 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 spacesignifica que os campos 3d e 4º da linha que contém VERSION=são a string que buscamos.

  3. sed

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

    O -ninterruptor suprime a saída normal, nenhuma linha será impressa. O -rpermite expressões regulares estendidas. Em seguida, nas linhas correspondentes VERSION=, excluiremos tudo, exceto as duas últimas palavras. O pfinal significa imprimir.

  4. perl

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

    O -nmeio 'processa cada linha de entrada com o script fornecido por -e". Ele -ladiciona um caractere de nova linha a cada chamada impressa (e algumas outras coisas que não são relevantes aqui). A expressão regular corresponde às duas últimas palavras ( \bé um limite de palavra) e imprime-os se a linha contiver VERSION=.

  5. coreutils

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

    Aqui, usamos apenas grepa linha relevante e usamos a cutconfiguração do separador de campo para space( -d ' ') e a impressão de tudo, desde o 2º campo até o final da linha. O tr -dcomando excluirá o "do final.

  6. Casca pura (roubar descaradamente a sourceidéia inteligente de @ gniourf_gniourf ):

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

    As .fontes do arquivo que disponibiliza as variáveis ​​para o shell e eu uso os recursos de manipulação de string do bash para remover os números de versão.

terdon
fonte
1

Usando 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 VERSIONno arquivo /etc/os-release. Em seguida, ele encontra duas palavras sucessivas separadas por um espaço (Perl regex). O sinalizador -o mantém apenas o que corresponde à pesquisa.

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

Romain Vincent
fonte