Come ottenere il nome in codice completo della distribuzione 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"

L'output dei comandi sopra mostra solo il nome del codice parziale (cioè, trusty). Come posso ottenere il nome in codice completo ( fidato tahr ) del mio sistema Ubuntu installato?


1
Sembra che ci sia un processo convergente verso l' approvvigionamento del file /etc/os-release. Forse dovresti specificare cosa intendi con Come posso ottenere il nome in codice completo (fidato tahr) del mio sistema Ubuntu installato? . Vuoi solo riecheggiarlo sul terminale o ne hai bisogno assegnato a una variabile? Sarà usato su alcuni sistemi non {Ubuntu, Debian}?
gniourf_gniourf,

Risposte:


43

Non utilizzare strumenti esterni:

Puoi semplicemente source (il comando source è un punto .) /etc/os-releasee avrai accesso a tutte le variabili definite lì:

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

Modificare. Se si desidera rimuovere la 14.04,parte (come richiesto da terdon), è possibile:

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

Si noti che questo è un po 'goffo, poiché su altre distribuzioni, il VERSIONcampo può avere un formato diverso. Ad esempio, sul mio debian,

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

Quindi, potresti immaginare qualcosa del genere (in una sceneggiatura):

#!/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
(l'eco è incorporato) ma OK, che ne dici di questo . /etc/os-release && echo ${VERSION//[0-9,. ]/ }:?
terdon

1
@terdon c'è più di un modo per scuoiare un gatto ;D.
gniourf_gniourf,

Che cosa è successo a tutti i commenti qui?
gniourf_gniourf,

2
Ce ne sono molti e il tuo è particolarmente buono! I commenti non pertinenti alla risposta effettiva possono essere eliminati senza preavviso.
terdon

8

La mia variante su ciò che è già offerto:

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

La risposta più breve e più pessima fino ad oggi.

Se non ti interessa caricare /etc/os-releasei contenuti nel tuo ambiente attuale, puoi falsificare bash pensando che stia caricando uno script abbastanza facilmente:

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

3
Come osi dire più timido di ogni altra cosa fino ad oggi ? ci sono altre risposte bash complete qui :D.
gniourf_gniourf,

Perché il downvote? è una buona risposta (anche se con niente concettualmente diverso dagli altri dati prima).
gniourf_gniourf,

2
Heh, uso intelligente della sostituzione del processo, +1.
terdon

come ci si aspetterebbe dal maestro @terdon :)
Rinzwind

1
Un semplice subshell farebbe il lavoro pure: ( . /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

Spiegazione:

  • lsb_release -rs -> Stampa la versione di Ubuntu installata.

  • grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info -> Prendi tutte le righe che contengono la versione di rilascio, nel mio caso è 14.04.

  • grep -m 1 "Description: Ubuntu "-> Ancora una volta prende solo la prima riga corrispondente (a causa del -mflag) che contiene la stringa Description: Ubuntu.

  • cut -d "'" -f2 -> stampa il campo numero 2 in base alla virgoletta singola delimitatore '

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

Spiegazione:

La dichiarazione e l'assegnazione della variabile in awk viene eseguita tramite il -vparametro, quindi il valore del lsb_release -rs comando viene assegnato alla variabile varche consente di stampare il campo 4, il campo 5 dalle righe contiene la stringa 14.04ed esiste se ne trova una. Infine il cutcomando aiuta a rimuovere le virgolette singole.


4

Il comando che stai cercando è:

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

Questo è molto brutto e non ottimizzato. Sono sicuro che dovrebbe esserci un metodo più semplice e questo ha alcuni problemi.


1
. /etc/os-release 
echo $VERSION

3
Devi ancora rimuovere i numeri, vedi la risposta di @ gniourf_gniourf di seguito che utilizza esattamente lo stesso approccio.
terdon

1

Ecco alcune altre scelte. Tutti analizzano il /etc/os-releasefile che, sul mio 13.10, assomiglia a questo:

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

Tutte le soluzioni seguenti analizzeranno la seconda riga da produrre Saucy Salamander.

  1. grep

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

    Il -omezzo "stampa solo la parte corrispondente della riga" e -Pabilita le espressioni regolari compatibili Perl. Questo ci permette di usare \Kquali scarti qualsiasi cosa sia stata abbinata fino a quel punto, che combinata con -omezzi "stampa solo ciò che corrisponde dopo il \K. Quindi, l'espressione regolare effettiva usata corrisponderà alle ultime due parole di una riga che contiene VERSION=.

  2. awk

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

    Impostare il separatore di campi su "e spacesignifica che i campi 3d e 4 della riga contenente VERSION=sono la stringa che stiamo cercando.

  3. sed

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

    L' -ninterruttore elimina l'output normale, non verranno stampate righe. Il -rpermette esteso le espressioni regolari. Quindi, sulle righe corrispondenti VERSION=, elimineremo tutto tranne le ultime due parole. Alla pfine significa stampa.

  4. perl

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

    Il -nmezzo "elabora ogni riga di input con lo script indicato da -e". -lAggiunge un carattere di nuova riga a ogni chiamata di stampa (e alcune altre cose che non sono rilevanti qui). L'espressione regolare corrisponde alle ultime due parole ( \bè un limite di parole) e li stampa se la riga contiene VERSION=.

  5. coreutils

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

    Qui, abbiamo solo grepla riga pertinente e usiamo l' cutimpostazione del separatore di campo su space( -d ' ') e la stampa di tutto dal 2 ° campo alla fine della riga. Il tr -dcomando eliminerà il "dalla fine.

  6. Pure shell (rubare spudoratamente l' sourceidea geniale di @ gniourf_gniourf ):

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

    Il .file genera il file che rende le variabili disponibili per la shell e io utilizzo le funzionalità di manipolazione delle stringhe di bash per rimuovere i numeri di versione.


1

Usando regex potresti fare questo:

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

Spiegazione:

Questo cerca la riga con VERSIONnel file /etc/os-release. Quindi trova 2 parole successive separate da uno spazio (Perl regex). Il flag -o mantiene solo ciò che corrisponde alla ricerca.

Devi usare [a-zA-Z]invece di `w` per evitare di includere cifre.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.