GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo obtener el nombre de distribución y el número de versión en un script de Shell simple?

Estoy trabajando en un script bash simple que debería poder ejecutarse en distribuciones Ubuntu y CentOS (la compatibilidad con Debian y Fedora/RHEL sería una ventaja) y necesito saber el nombre y la versión de la distribución que ejecuta el script ( para desencadenar acciones específicas, por ejemplo, la creación de repositorios). Hasta ahora lo que tengo es esto:

OS=$(awk '/DISTRIB_ID=/' /etc/*-release | sed 's/DISTRIB_ID=//' | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')
VERSION=$(awk '/DISTRIB_RELEASE=/' /etc/*-release | sed 's/DISTRIB_RELEASE=//' | sed 's/[.]0/./')

if [ -z "$OS" ]; then
    OS=$(awk '{print $1}' /etc/*-release | tr '[:upper:]' '[:lower:]')
fi

if [ -z "$VERSION" ]; then
    VERSION=$(awk '{print $3}' /etc/*-release)
fi

echo $OS
echo $ARCH
echo $VERSION

Esto parece para trabajar, devolviendo ubuntu o centos (No he probado otros) como el nombre de la versión. Sin embargo, tengo la sensación de que debe haber una manera más fácil y confiable de averiguarlo. ¿Es eso cierto?

No funciona para RedHat.
/etc/redhat-release contiene:
Redhat Linux Entreprise versión 5.5

Entonces, la versión no es la tercera palabra, será mejor que uses :

OS_MAJOR_VERSION=`sed -rn 's/.*([0-9]).[0-9].*/1/p' /etc/redhat-release`
OS_MINOR_VERSION=`sed -rn 's/.*[0-9].([0-9]).*/1/p' /etc/redhat-release`
echo "RedHat/CentOS $OS_MAJOR_VERSION.$OS_MINOR_VERSION"

Respuesta aceptada:

Para obtener OS y VER , el último estándar parece ser /etc/os-release .
Antes de eso, existía lsb_release y /etc/lsb-release . Antes de eso, tenías que buscar diferentes archivos para cada distribución.

Esto es lo que sugeriría

if [ -f /etc/os-release ]; then
    # freedesktop.org and systemd
    . /etc/os-release
    OS=$NAME
    VER=$VERSION_ID
elif type lsb_release >/dev/null 2>&1; then
    # linuxbase.org
    OS=$(lsb_release -si)
    VER=$(lsb_release -sr)
elif [ -f /etc/lsb-release ]; then
    # For some versions of Debian/Ubuntu without lsb_release command
    . /etc/lsb-release
    OS=$DISTRIB_ID
    VER=$DISTRIB_RELEASE
elif [ -f /etc/debian_version ]; then
    # Older Debian/Ubuntu/etc.
    OS=Debian
    VER=$(cat /etc/debian_version)
elif [ -f /etc/SuSe-release ]; then
    # Older SuSE/etc.
    ...
elif [ -f /etc/redhat-release ]; then
    # Older Red Hat, CentOS, etc.
    ...
else
    # Fall back to uname, e.g. "Linux <version>", also works for BSD, etc.
    OS=$(uname -s)
    VER=$(uname -r)
fi

Creo que uname para obtener ARCH sigue siendo la mejor manera. Pero el ejemplo que diste obviamente solo maneja sistemas Intel. Yo lo llamaría BITS así:

case $(uname -m) in
x86_64)
    BITS=64
    ;;
i*86)
    BITS=32
    ;;
*)
    BITS=?
    ;;
esac

O cambie ARCH para ser las versiones más comunes, pero sin ambigüedades:x86 y x64 o similar:

case $(uname -m) in
x86_64)
    ARCH=x64  # or AMD64 or Intel64 or whatever
    ;;
i*86)
    ARCH=x86  # or IA32 or Intel32 or whatever
    ;;
*)
    # leave ARCH as-is
    ;;
esac

pero, por supuesto, eso depende de ti.

Relacionado:¿Cuál es la diferencia entre print y printf en awk?
Linux
  1. ¿Cómo obtener el nombre de la rama git actual en una variable en un script de Shell?

  2. ¿Cómo hacer que ls ordene por extensión de archivo y luego por nombre?

  3. ¿Cómo puedo obtener el nombre de distribución y el número de versión en un script de shell simple?

  4. ¿Cómo puedo obtener mi dirección IP externa en un script de shell?

  5. ¿Cómo obtener el pid de un proceso e invocar kill -9 en el script de shell?

Cómo comparar números y cadenas en Linux Shell Script

Encuentre el nombre de distribución de Linux, la versión y los detalles del kernel

Cómo crear y ejecutar un script de Shell en Debian 10

Cómo crear y ejecutar un script de Shell en CentOS 8

Cómo encontrar el nombre y la versión de la versión de distribución de Linux

Cómo crear y ejecutar un script de shell en Ubuntu 22.04