Wie erhalte ich den vollständigen Codenamen der Ubuntu-Distribution?

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"

Die Ausgaben der obigen Befehle zeigen nur den Teilcodenamen (dh trusty). Wie erhalte ich den vollständigen Codenamen ( Trusty Tahr ) meines installierten Ubuntu-Systems?

Avinash Raj
quelle
1
Es scheint, dass es einen konvergenten Prozess zur Beschaffung der Datei gibt /etc/os-release. Vielleicht solltest du angeben, was du damit meinst. Wie erhalte ich den vollständigen Codenamen (Trusty Tahr) meines installierten Ubuntu-Systems? . Möchten Sie es nur auf dem Terminal wiedergeben oder müssen Sie es einer Variablen zuordnen? Wird dies auf einigen Nicht-{Ubuntu, Debian} -Systemen verwendet?
gniourf_gniourf

Antworten:

43

Verwenden Sie keine externen Tools:

Sie können einfach eine Quelle angeben (der Befehl source ist ein Punkt .), /etc/os-releaseund Sie haben Zugriff auf alle dort definierten Variablen:

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

Bearbeiten. Wenn Sie das 14.04,Teil entfernen möchten (wie von Terdon verlangt), können Sie:

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

Beachten Sie, dass dies etwas umständlich ist, da das VERSIONFeld bei anderen Distributionen ein anderes Format haben kann. ZB auf meinem Debian,

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

Dann könnten Sie sich so etwas vorstellen (in einem Skript):

#!/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
quelle
1
(Echo ist builtin) , aber OK, wie wäre es damit: . /etc/os-release && echo ${VERSION//[0-9,. ]/ }?
Terdon
1
@terdon Es gibt mehr als einen Weg, eine Katze zu häuten ;D.
gniourf_gniourf
Was ist mit all den Kommentaren hier passiert?
gniourf_gniourf
2
Es gibt viele und deine ist eine besonders gute! Kommentare, die für die eigentliche Antwort irrelevant sind, können ohne Vorwarnung gelöscht werden.
Terdon
8

Meine Variante zu dem, was bereits angeboten wird:

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

Die bisher kürzeste und pessimistischste Antwort.

Wenn Sie den /etc/os-releaseInhalt nicht in Ihre aktuelle Umgebung laden möchten, können Sie sich vorstellen, dass ein Skript ziemlich einfach geladen werden kann:

bash <(cat /etc/os-release; echo 'echo ${VERSION/*, /}')
Oli
quelle
3
Wie kannst du es wagen, Bashier als alles andere zu sagen ? Es gibt hier noch andere vollständige Antworten :D.
gniourf_gniourf
Warum die Gegenstimme? Es ist eine gute Antwort (obwohl es sich konzeptionell nicht von den anderen unterscheidet, die vorher gegeben wurden).
gniourf_gniourf
2
He, kluger Einsatz von Prozesssubstitution, +1.
Terdon
wie man es vom master @terdon erwarten würde :)
Rinzwind
1
Eine einfache Subshell würde den Job auch: ( . /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

Erläuterung:

  • lsb_release -rs -> Druckt Ihre installierte Ubuntu-Version.

  • grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info -> Besorgen Sie sich alle Zeilen, die Ihre Release-Version enthalten, in meinem Fall ist es 14.04.

  • grep -m 1 "Description: Ubuntu "-> Greift wieder nur die übereinstimmende erste Zeile (wegen -mFlag), die den String enthält Description: Ubuntu.

  • cut -d "'" -f2 -> druckt das Feld Nummer 2 in Anführungszeichen '

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

Erläuterung:

Das Deklarieren und Zuweisen von Variablen in awk erfolgt über den -vParameter. Der lsb_release -rs Befehlswert wird also der Variablen zugewiesen, die varbeim Drucken von Feld 4 helfen soll. Feld 5 aus den Zeilen enthält die Zeichenfolge 14.04und existiert, wenn eine Eins gefunden wird. Schließlich cuthilft der Befehl entfernen Sie die einfachen Anführungszeichen.

Avinash Raj
quelle
4

Der gesuchte Befehl lautet:

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

Das ist sehr hässlich und nicht optimiert. Ich bin sicher, dass es eine einfachere Methode geben sollte, und dies hat einige Probleme.

Braiam
quelle
1
. /etc/os-release 
echo $VERSION
MegaBrutal
quelle
3
Sie müssen die Zahlen immer noch entfernen, siehe @ gniourf_gniourfs Antwort unten, die genau den gleichen Ansatz verwendet.
Terdon
1

Hier sind einige weitere Optionen. Sie alle analysieren die /etc/os-releaseDatei, die in meinem 13.10 so aussieht:

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

Alle unten aufgeführten Lösungen analysieren die zweite zu erzeugende Zeile Saucy Salamander.

  1. grep

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

    Das -obedeutet "Nur den passenden Teil der Zeile drucken" und -Paktiviert Perl-kompatible reguläre Ausdrücke. Auf diese Weise können wir verwenden \K, was bis zu diesem Punkt gelöscht wurde. In Kombination mit -obedeutet dies, dass nur das ausgegeben wird, was nach dem übereinstimmt \K. Der tatsächlich verwendete reguläre Ausdruck stimmt also mit den letzten beiden Wörtern einer Zeile überein, die enthält VERSION=.

  2. awk

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

    Das Setzen des Feldtrennzeichens auf "und spacebedeutet, dass das 3d- und das 4. Feld der Zeile, die enthält, VERSION=die Zeichenfolge sind, nach der wir suchen .

  3. sed

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

    Der -nSchalter unterdrückt die normale Ausgabe, es werden keine Zeilen gedruckt. Das -rerlaubt erweiterte reguläre Ausdrücke. In übereinstimmenden Zeilen VERSION=löschen wir dann alles außer den letzten beiden Wörtern. Das pam Ende bedeutet Drucken.

  4. perl

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

    Die -nMittel 'verarbeiten jede Eingabezeile mit dem von -e" gegebenen Skript . Das -lfügt jedem Druckaufruf ein Zeilenumbruchzeichen hinzu (und einige andere Dinge, die hier nicht relevant sind). Der reguläre Ausdruck entspricht den letzten beiden Wörtern ( \bist eine Wortgrenze) und druckt sie aus, wenn die Zeile enthält VERSION=.

  5. coreutils

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

    Hier geben wir nur grepdie relevante Zeile ein und setzen cutdas Feldtrennzeichen auf space( -d ' ') und drucken alles vom 2. Feld bis zum Ende der Zeile. Der tr -dBefehl löscht das "vom Ende.

  6. Pure Shell (schamlos die clevere sourceIdee von @ gniourf_gniourf stehlen ):

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

    Die .Quelle ist die Datei, die die Variablen der Shell zur Verfügung stellt, und ich verwende die String-Manipulationsfunktionen von bash , um die Versionsnummern zu entfernen.

terdon
quelle
1

Mit Regex können Sie dies tun:

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

Erläuterung:

Dies durchsucht die Zeile mit VERSIONin der Datei /etc/os-release. Dann findet es 2 aufeinanderfolgende Wörter, die durch ein Leerzeichen getrennt sind (Perl-Regex). Das Flag -o behält nur das bei, was der Suche entspricht.

Sie müssen [a-zA-Z]anstelle von "w" verwenden, um das Einfügen von Ziffern zu vermeiden.

Romain Vincent
quelle