¿Cómo obtener el nombre de código completo de la distribución de 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"

La salida de los comandos anteriores muestra solo el nombre del código parcial (es decir, trusty). ¿Cómo obtengo el nombre en código completo ( trusty tahr ) de mi sistema Ubuntu instalado?


1
Parece que hay un proceso convergente hacia la fuente del archivo /etc/os-release. Tal vez debería especificar qué quiere decir con ¿Cómo obtengo el nombre en código completo (trusty tahr) de mi sistema Ubuntu instalado? . ¿Solo desea repetirlo en el terminal o necesita asignarlo a una variable? ¿Se utilizará en algunos sistemas que no sean {Ubuntu, Debian}?
gniourf_gniourf

Respuestas:


43

Sin usar herramientas externas:

Puede simplemente fuente (el comando fuente es un punto .) /etc/os-releasey tendrá acceso a todas las variables definidas allí:

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

Editar. Si desea eliminar la 14.04,pieza (según lo solicitado por terdon), puede:

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

Tenga en cuenta que esto es un poco torpe, ya que en otras distribuciones, el VERSIONcampo puede tener un formato diferente. Por ejemplo, en mi debian,

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

Entonces, podrías imaginar algo como esto (en 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

1
(echo está incorporado) pero OK, ¿qué tal esto . /etc/os-release && echo ${VERSION//[0-9,. ]/ }?
terdon

1
@terdon hay más de una forma de pelar un gato ;D.
gniourf_gniourf

¿Qué pasó con todos los comentarios aquí?
gniourf_gniourf

2
¡Hay muchos y el tuyo es particularmente bueno! Los comentarios que son irrelevantes para la respuesta real se pueden eliminar sin previo aviso.
terdon

8

Mi variante sobre lo que ya se ofrece:

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

La respuesta más corta y bastarda hasta la fecha.

Si no le importa cargar /etc/os-releaseel contenido en su entorno actual, puede fingir que Bash cree que está cargando un script con bastante facilidad:

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

3
¿Cómo te atreves a decir más tímido que cualquier otra cosa hasta la fecha ? Hay otras respuestas bash completas aquí :D.
gniourf_gniourf

¿Por qué el voto negativo? es una buena respuesta (aunque sin nada conceptualmente diferente de otros dados antes).
gniourf_gniourf

2
Je, uso inteligente de la sustitución del proceso, +1.
terdon

como cabría esperar del maestro @terdon :)
Rinzwind

1
Un subnivel sencilla sería hacer el trabajo, así: ( . /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

Explicación:

  • lsb_release -rs -> Imprime tu versión de Ubuntu instalada.

  • grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info -> Toma todas las líneas que contienen tu versión de lanzamiento, en mi caso es 14.04.

  • grep -m 1 "Description: Ubuntu "-> De nuevo, solo toma la primera línea coincidente (debido a la -mbandera) que contiene la cadena Description: Ubuntu.

  • cut -d "'" -f2 -> imprime el campo número 2 de acuerdo con la comilla simple del 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

Explicación:

La declaración y asignación de Variable en awk se realiza a través del -vparámetro. Por lo tanto, el valor del lsb_release -rs comando se asigna a la variable varque ayuda a imprimir el campo 4, el campo 5 de las líneas contiene la cadena 14.04y existe si se encuentra uno. Finalmente, el cutcomando ayuda a eliminar las comillas simples.


4

El comando que estás buscando es:

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

Esto es muy feo y no está optimizado. Estoy seguro de que debería haber un método más fácil y esto tiene algunos problemas.


1
. /etc/os-release 
echo $VERSION

3
Aún necesita eliminar los números, consulte la respuesta de @ gniourf_gniourf a continuación que utiliza exactamente el mismo enfoque.
terdon

1

Aquí hay algunas opciones más. Todos analizan el /etc/os-releasearchivo que, en mi 13.10, se ve así:

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 las soluciones a continuación analizarán la segunda línea para producir Saucy Salamander.

  1. grep

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

    El -omedio "imprime solo la parte correspondiente de la línea" y -Phabilita las expresiones regulares compatibles con Perl. Esto nos permite utilizar \Klo que descarta lo fue igualada hasta ese momento, lo que combinado con -olos medios "imprimir sólo lo que coincide después de la \K. Por lo tanto, la expresión regular efectivamente usado coincida con las dos últimas palabras de una línea que contiene VERSION=.

  2. awk

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

    Establecer el separador de campos en "y spacesignifica que los campos 3d y cuarto de la línea que contiene VERSION=son la cadena que buscamos.

  3. sed

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

    El -ninterruptor suprime la salida normal, no se imprimirán líneas. El -rpermite que las expresiones regulares extendidas. Luego, en las líneas que coinciden VERSION=, eliminaremos todo excepto las dos últimas palabras. El pfinal significa imprimir.

  4. perl

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

    Los -nmedios 'procesan cada línea de entrada con el script dado por -e". -lAgrega un carácter de nueva línea a cada llamada impresa (y algunas otras cosas que no son relevantes aquí). La expresión regular coincide con las dos últimas palabras ( \bes un límite de palabra) y los imprime si la línea contiene VERSION=.

  5. coreutils

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

    Aquí, solo utilizamos grepla línea relevante y utilizamos la cutconfiguración del separador de campo en space( -d ' ') e imprimimos todo, desde el segundo campo hasta el final de la línea. El tr -dcomando eliminará "desde el final.

  6. Concha pura (robando descaradamente la sourceidea inteligente de @ gniourf_gniourf ):

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

    Las .fuentes del archivo que hace que las variables estén disponibles para el shell y yo uso las capacidades de manipulación de cadenas de bash para eliminar los números de versión.


1

Usando regex podrías hacer esto:

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

Explicación:

Esto busca la línea con VERSIONen el archivo /etc/os-release. Luego encuentra 2 palabras sucesivas separadas por un espacio (Perl regex). La bandera -o mantiene solo lo que coincide con la búsqueda.

[a-zA-Z]Debe usar en lugar de 'w' para evitar incluir dígitos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.