Comment obtenir le nom de code complet de la distribution 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"

Les sorties des commandes ci-dessus ne montrent que le nom de code partiel (c'est-à-dire trusty). Comment obtenir le nom de code complet ( trusty tahr ) de mon système Ubuntu installé?

Avinash Raj
la source
1
Il semble qu'il y ait un processus convergent vers l' approvisionnement du fichier /etc/os-release. Peut-être vous devriez préciser ce que vous entendez par Comment puis-je obtenir le plein nom de code (de tahr fidèle) de mon système installé Ubuntu? . Voulez-vous seulement le répercuter sur le terminal ou avez-vous besoin qu'il soit assigné à une variable? Est-ce que cela va être utilisé sur des systèmes non {Ubuntu, Debian}?
gniourf_gniourf

Réponses:

43

Ne pas utiliser d'outils externes:

Vous pouvez simplement source (la commande source est un point .) /etc/os-releaseet vous aurez accès à toutes les variables définies ici:

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

Modifier. Si vous souhaitez supprimer la 14.04,pièce (comme demandé par terdon), vous pouvez:

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

Notez que c'est un peu maladroit, car sur d'autres distributions, le VERSIONchamp peut avoir un format différent. Par exemple, sur mon debian,

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

Ensuite, vous pouvez imaginer quelque chose comme ceci (dans un 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
la source
1
(écho est builtin) mais OK, que diriez - vous: . /etc/os-release && echo ${VERSION//[0-9,. ]/ }?
terdon
1
@terdon il y a plus d'une façon de peler un chat ;D.
gniourf_gniourf
Qu'est-il arrivé à tous les commentaires ici?
gniourf_gniourf
2
Il y en a beaucoup et le tien est particulièrement bon! Les commentaires sans rapport avec la réponse réelle peuvent être supprimés sans avertissement.
terdon
8

Ma variante sur ce qui est déjà offert:

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

La réponse la plus courte et la plus modeste à ce jour.

Si vous ne vous souciez pas de charger /etc/os-releasele contenu dans votre environnement actuel, vous pouvez simuler bash en pensant qu'il charge un script assez facilement:

bash <(cat /etc/os-release; echo 'echo ${VERSION/*, /}')
Oli
la source
3
Comment osez-vous dire bashier que tout ce que vous avez eu à ce jour ? il y a d'autres réponses complètes bash ici :D.
gniourf_gniourf
Pourquoi le vote négatif? c'est une bonne réponse (bien que rien ne soit différent conceptuellement des précédents).
gniourf_gniourf
2
Heh, utilisation intelligente de la substitution de processus, +1.
terdon
comme on pouvait s'y attendre du maître @terdon :)
Rinzwind
1
Un sous - shell simple serait faire le travail aussi bien: ( . /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

Explication:

  • lsb_release -rs -> Imprime la version de votre Ubuntu installée.

  • grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info -> Prenez toutes les lignes contenant votre version, dans mon cas, il s’agit de 14.04.

  • grep -m 1 "Description: Ubuntu "-> Encore une fois, saisit uniquement la première ligne correspondante (en raison de l' -mindicateur) qui contient la chaîne Description: Ubuntu.

  • cut -d "'" -f2 -> imprime le champ numéro 2 en fonction du guillemet simple du séparateur '

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

Explication:

La déclaration et l’affectation de variable dans awk sont effectuées via le -vparamètre. Ainsi, la valeur de lsb_release -rs commande est affectée à la variable varqui aide à imprimer le champ 4, le champ 5 à partir des lignes contient la chaîne 14.04et existe si sa valeur est trouvée.cut commande aide à supprimer les guillemets simples.

Avinash Raj
la source
4

La commande que vous recherchez est:

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

C'est très moche et pas optimisé. Je suis sûr qu'il devrait y avoir une méthode plus facile et cela a quelques problèmes.

Braiam
la source
1
. /etc/os-release 
echo $VERSION
MegaBrutal
la source
3
Vous devez toujours supprimer les chiffres, voir la réponse de @ gniourf_gniourf ci-dessous qui utilise exactement la même approche.
terdon
1

Voici quelques autres choix. Ils analysent tous le /etc/os-releasefichier qui ressemble à ceci sur ma 13.10:

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

Toutes les solutions ci-dessous analyseront la deuxième ligne à produire Saucy Salamander.

  1. grep

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

    Les -omoyens "imprimer uniquement la partie correspondante de la ligne" et -Pactivent les expressions régulières compatibles Perl. Cela nous permet d’utiliser \Kce qui a été mis en correspondance jusqu’à ce point, ce qui, combiné avec le -omot "imprimer uniquement ce qui correspond après le \K." Ainsi, l’expression régulière utilisée correspondra aux deux derniers mots d’une ligne qui contient VERSION=.

  2. awk

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

    Définir le séparateur de champs sur "et spacesignifie que les champs 3d et 4ème de la ligne contenant VERSION=sont la chaîne que nous recherchons.

  3. sed

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

    Le -ncommutateur supprime la sortie normale, aucune ligne ne sera imprimée. Le -rpermet aux expressions régulières étendues. Ensuite, sur les lignes qui correspondent VERSION=, nous supprimerons tout sauf les deux derniers mots. La pfin signifie impression.

  4. perl

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

    Le -nmoyen "traite chaque ligne d'entrée avec le script donné par -e". Il -lajoute un caractère de nouvelle ligne à chaque appel d'impression (et d'autres éléments non pertinents ici). L'expression régulière correspond aux deux derniers mots ( \best une limite de mot) et les imprime si la ligne contient VERSION=.

  5. coreutils

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

    Ici, nous nous contentons de grepla ligne appropriée et utilisons le cutparamétrage du séparateur de champs sur space( -d ' ') et l’impression de tout, du deuxième champ à la fin de la ligne. La tr -dcommande supprimera le "de la fin.

  6. Coquille pure (voler sans vergogne l' sourceidée intelligente de @ gniourf_gniourf ):

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

    Les .sources du fichier qui met les variables à la disposition du shell et j'utilise les capacités de manipulation de chaînes de bash pour supprimer les numéros de version.

terdon
la source
1

En utilisant regex, vous pouvez faire ceci:

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

Explication:

Ceci recherche la ligne VERSIONdans le fichier /etc/os-release. Ensuite, il trouve 2 mots successifs séparés par un espace (expression rationnelle Perl). Le drapeau -o ne garde que ce qui correspond à la recherche.

Vous devez utiliser [a-zA-Z]au lieu de `w` pour éviter d'inclure des chiffres.

Romain Vincent
la source