$ 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
name__). Comment obtenir le nom de code complet (trusty tahr) de mon système Ubuntu installé?
Ne pas utiliser d'outils externes:
Vous pouvez simplement source (la commande source est un point .
) le /etc/os-release
et vous aurez accès à toutes les variables définies ici:
$ . /etc/os-release
$ echo "$VERSION"
14.04, Trusty Tahr
Edit. Si vous souhaitez supprimer la partie 14.04,
(comme demandé par terdon), vous pouvez:
$ . /etc/os-release
$ read _ UBUNTU_VERSION_NAME <<< "$VERSION"
$ echo "$UBUNTU_VERSION_NAME"
Trusty Tahr
Notez que ceci est un peu maladroit, car sur d'autres distributions, le champ VERSION
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
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 le contenu de /etc/os-release
dans votre environnement actuel, vous pouvez simuler bash en pensant qu'il est en train de charger un script assez facilement:
bash <(cat /etc/os-release; echo 'echo ${VERSION/*, /}')
$ grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info | grep -m 1 "Description: Ubuntu " | cut -d "'" -f2
Trusty Tahr
lsb_release -rs
-> Imprime la version de votre Ubuntu installée.
grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info
-> Saisissez 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'indicateur -m
) qui contient la chaîne Description: Ubuntu
.
cut -d "'" -f2
-> imprime le champ numéro 2 selon le délimiteur guillemet simple '
$ awk -v var=$(lsb_release -rs) '$3~var {print $4" "$5;exit;}' /usr/share/python-apt/templates/Ubuntu.info | cut -d"'" -f2
Trusty Tahr
La déclaration et l'affectation de variable dans awk sont effectuées à l'aide du paramètre -v
.Pour que la valeur de la commande lsb_release -rs
soit affectée à la variable var
qui, à son tour, aide à imprimer le champ 4, le champ 5 des lignes contient la chaîne 14.04
et existe si elle a été trouvée. la commande cut
permet de supprimer les guillemets simples.
La commande que vous recherchez est:
grep -oP '(?<=VERSION\=\"(\d\d)\.(\d\d)\,\ )(.*?)(?="$)' /etc/os-release
C'est très moche et non optimisé. Je suis sûr qu'il devrait y avoir une méthode plus facile et cela a quelques problèmes.
En utilisant regex, vous pouvez faire ceci:
grep 'VERSION' /etc/os-release | grep -oP "[a-zA-Z]+ [a-zA-Z]+"
Ceci recherche la ligne avec VERSION
dans 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.
Voici quelques autres choix. Ils analysent tous le fichier /etc/os-release
qui ressemble à ceci sur mon 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 pour générer Saucy Salamander
.
grep
name__
grep -oP 'VERSION=.* \K\w* \w*' /etc/os-release
-o
signifie "n'imprimer que la partie correspondante de la ligne" et -P
active les expressions régulières compatibles Perl. Cela nous permet d’utiliser \K
qui supprime tout ce qui a été mis en correspondance jusqu’à ce point, ce qui, combiné à -o
signifie "affiche uniquement ce qui correspond après le \K
. L’expression régulière utilisée correspond aux deux derniers mots d’une ligne contenant VERSION=
.
awk
name__
awk -F'[" ]' '/VERSION=/{print $3,$4}' /etc/os-release
Définir le séparateur de champs sur "
et space
signifie que les champs 3d et 4ème de la ligne contenant VERSION=
sont la chaîne que nous recherchons.
sed
name__
sed -nr '/VERSION=/{s/.* (\w* \w*)"/\1/;p}' /etc/os-release
Le commutateur -n
supprime la sortie normale, aucune ligne ne sera imprimée. Le -r
autorise les expressions régulières étendues. Ensuite, sur les lignes qui correspondent à VERSION=
, nous supprimerons tout sauf les deux derniers mots. p
à la fin signifie imprimer.
Perl
name__
Perl -lne '/VERSION=.*\b(\w+ \w+)/ && print $1' /etc/os-release
-n
signifie 'traiter chaque ligne d'entrée avec le script donné par -e
". Le -l
ajoute un caractère de nouvelle ligne à chaque appel à imprimer (et quelques autres éléments qui ne sont pas pertinents ici). L'expression régulière correspond aux deux derniers mots (\b
est un Limite de mot) et les affiche si la ligne contient VERSION=
.
coreutils
grep VERSION= /etc/os-release | cut -d ' ' -f 2- | tr -d '"'
Ici, nous ne faisons que grep
la ligne pertinente et utilisons cut
en définissant le séparateur de champ sur space
(-d ' '
) et en imprimant le tout, du deuxième champ à la fin de la ligne. La commande tr -d
supprimera le "
de la fin.
Pure Shell (voler sans vergogne l'idée géniale de source
de @ gniourf_gniourf):
. /etc/os-release && echo ${VERSION//[0-9,. ]/ }
Le .
source le fichier qui met les variables à la disposition du shell et j'utilise les bash capacités de manipulation de chaîne pour supprimer les numéros de version.
. /etc/os-release
echo $VERSION