¿Cómo detectar el sistema operativo desde un script Bash?

526

Me gustaría mantener mis archivos .bashrcy .bash_loginen el control de versiones para poder usarlos entre todas las computadoras que uso. El problema es que tengo algunos alias específicos del sistema operativo, así que estaba buscando una manera de determinar si el script se ejecuta en Mac OS X, Linux o Cygwin .

¿Cuál es la forma correcta de detectar el sistema operativo en un script Bash ?

csexton
fuente
1
¿Alguna vez has considerado compartir tus configuraciones? Estaba buscando obtener el mismo tipo de configuración :)
sorin
@sorin Sé que es un comentario antiguo, pero si todavía tienes curiosidad, he estado creando ProfileGem que te permite configurar entornos bash conectables para todas tus máquinas.
dimo414
1
@ dimo414 profilegem parece haberse movido aquí bitbucket.org/dimo414/profilegem . En cuanto a compartir configuraciones de bash en general, pruebe algunos de estos proyectos dotfiles
mahemoff
1
@mahemoff gracias por el enlace actualizado, lo siento, no puedo editar mi comentario. Agradecería comentarios o errores si está experimentando con ProfileGem.
dimo414
Por desgracia, BitBucket está rechazando el soporte de Mercurial, así que tengo que actualizar mi enlace nuevamente :( github.com/dimo414/ProfileGem es el nuevo hogar.
dimo414

Respuestas:

522

Creo que lo siguiente debería funcionar. Aunque no estoy seguro win32.

if [[ "$OSTYPE" == "linux-gnu"* ]]; then
        # ...
elif [[ "$OSTYPE" == "darwin"* ]]; then
        # Mac OSX
elif [[ "$OSTYPE" == "cygwin" ]]; then
        # POSIX compatibility layer and Linux environment emulation for Windows
elif [[ "$OSTYPE" == "msys" ]]; then
        # Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
elif [[ "$OSTYPE" == "win32" ]]; then
        # I'm not sure this can happen.
elif [[ "$OSTYPE" == "freebsd"* ]]; then
        # ...
else
        # Unknown.
fi
Timmmm
fuente
77
En Windows, obtendrá msyspara Git Bash / msysGit, y cygwinpara Cygwin
friederbluemle
1
Esta respuesta que incluye cómo detectar para Windows es buena. También estoy usando Mingw32 y aparece comomsys
d48
2
Interesante ... Mac OSX todavía daría 'darwin'.
jonathanbell
66
Algo que me hizo tropezar, cuando reemplazas el comentario con un comando, asegúrate de terminar con ;.
Vadim Peretokin
1
Cuando agrego un comando como source somefile ; , obtengo syntax error near unexpected token elif.
pez remo
292

Para mi .bashrc, uso el siguiente código:

platform='unknown'
unamestr=`uname`
if [[ "$unamestr" == 'Linux' ]]; then
   platform='linux'
elif [[ "$unamestr" == 'FreeBSD' ]]; then
   platform='freebsd'
fi

Luego hago cosas como:

if [[ $platform == 'linux' ]]; then
   alias ls='ls --color=auto'
elif [[ $platform == 'freebsd' ]]; then
   alias ls='ls -G'
fi

Es feo, pero funciona. Puede usar en caselugar de ifsi lo prefiere.

Nicolas Martyanoff
fuente
66
¿Por qué configura la plataforma desde unamestr, en lugar de solo usar unamestr?
csexton
80
No use backticks, use la nueva sintaxis más clara: "unamestr = $ (uname)".
Descanse el
15
De un vistazo rápido, los backticks podrían parecerse a una cuerda.
Harrison Powers
29
@ david-winiecki Porque si necesita anidar comandos, por ejemplo, $ (comando-1 $ (comando-2))
Michael Barton
44
¿No sería mucho mejor hacer: platform="$(uname | tr '[:upper:]' '[:lower:]')"y luego manejar definitivamente un caso? Simplemente parece extraño codificar una dependencia en una salida muy específica.
Brandon Buck
274

La página de manual de bash dice que la variable OSTYPE almacena el nombre del sistema operativo:

OSTYPESe establece automáticamente en una cadena que describe el sistema operativo en el que se ejecuta bash. El valor predeterminado depende del sistema.

Está configurado para linux-gnuaquí.

Johannes Schaub - litb
fuente
55
Además, $ OSTYPE es 'darwin9.0' en mi mac (Leopard) y 'cygwin' en Cygwin.
dF.
55
$ OSTYPE es darwin10.0 en SnowLeopard. ¿WTF con la versión añadida? Significa que una simple declaración de caso no funcionará.
mxcl
16
No es tan grande de un acuerdo para retirarlo:os=${OSTYPE//[0-9.]/}
Abach
86
case $OSTYPE in darwin*) echo I am a Mac ;; esac
tripleee
36
@tripleee o para personas que se sienten más cómodas con la sintaxis "if":if [[ $OSTYPE == darwin* ]]; then echo I am a Mac;fi
Rican7
159

$OSTYPE

Simplemente puede usar una $OSTYPEvariable predefinida , por ejemplo:

case "$OSTYPE" in
  solaris*) echo "SOLARIS" ;;
  darwin*)  echo "OSX" ;; 
  linux*)   echo "LINUX" ;;
  bsd*)     echo "BSD" ;;
  msys*)    echo "WINDOWS" ;;
  *)        echo "unknown: $OSTYPE" ;;
esac

Sin embargo, no es reconocido por los shells más antiguos (como el shell Bourne ).


uname

Otro método es detectar la plataforma en función del unamecomando.

Consulte el siguiente script (listo para incluir en .bashrc):

# Detect the platform (similar to $OSTYPE)
OS="`uname`"
case $OS in
  'Linux')
    OS='Linux'
    alias ls='ls --color=auto'
    ;;
  'FreeBSD')
    OS='FreeBSD'
    alias ls='ls -G'
    ;;
  'WindowsNT')
    OS='Windows'
    ;;
  'Darwin') 
    OS='Mac'
    ;;
  'SunOS')
    OS='Solaris'
    ;;
  'AIX') ;;
  *) ;;
esac

Puedes encontrar algún ejemplo práctico en mi.bashrc .


Aquí hay una versión similar utilizada en Travis CI :

case $(uname | tr '[:upper:]' '[:lower:]') in
  linux*)
    export TRAVIS_OS_NAME=linux
    ;;
  darwin*)
    export TRAVIS_OS_NAME=osx
    ;;
  msys*)
    export TRAVIS_OS_NAME=windows
    ;;
  *)
    export TRAVIS_OS_NAME=notset
    ;;
esac
kenorb
fuente
1
Al cheque $ OSTYPE le falta una rama para cygwin, lo que indicaría una máquina Windows. La comprobación de uname tampoco funcionaría correctamente, en cygwin uname devuelve "CYGWIN_NT-10.0" y en MinGW uname devuelve "MINGW64_NT-10.0".
Matt Pennington
1
alias ls = '/ bin / ls -G' es en realidad la opción segura, en el contexto de los fags basados ​​en OS ver superuser.com/a/1299969/84662
Andrei Neculau
Sugiero usar uname, Oracle ha pasado por alto la convención y ha puesto una cadena de versión gratuita con su OSTYPE ==> solaris2.11. unamees un poco más limpio y menos trabajo que hacer.
será
37

Detectar el sistema operativo y el tipo de CPU no es tan fácil de hacer de forma portátil . Tengo un shscript de aproximadamente 100 líneas que funciona en una gran variedad de plataformas Unix: cualquier sistema que he usado desde 1988.

Los elementos clave son

  • uname -pes del tipo de procesador pero generalmente se encuentra unknownen las plataformas modernas de Unix.

  • uname -m dará el "nombre de hardware de la máquina" en algunos sistemas Unix.

  • /bin/arch, si existe, generalmente dará el tipo de procesador.

  • uname sin argumentos nombrará el sistema operativo.

Eventualmente, tendrá que pensar en las distinciones entre plataformas y qué tan bien quiere hacerlas. Por ejemplo, para simplificar las cosas, trato a i386través de i686cualquier " Pentium*" y cualquier "AMD*Athlon* " como todo x86.

My ~/.profileejecuta un script en el inicio que establece una variable en una cadena que indica la combinación de CPU y sistema operativo. Tengo plataforma específica bin, man, lib, y includedirectorios que ponerse en marcha basa en eso. Luego establecí una gran cantidad de variables de entorno. Entonces, por ejemplo, un script de shell para reformatear el correo puede llamar, por ejemplo,$LIB/mailfmt que es un binario ejecutable específico de la plataforma.

Si desea cortar esquinas , uname -my plain unamele dirá lo que quiere saber en muchas plataformas. Agregue otras cosas cuando lo necesite. (¡Y usar case, no anidado if!)

Norman Ramsey
fuente
2
De acuerdo con el comando uname , uname sin parámetro es equivalente a usar el parámetro "-s": "-s Muestra el nombre del sistema. Este indicador está activado de forma predeterminada". Para ser explícito, se podría usar "uname -s" en lugar de "uname". (Elaborado de alguna manera en respuesta a 'Ayuda de salida de Shell' )
Peter Mortensen
¿Tiene un enlace a un github git o pastebin con este script 100 para detectar de manera confiable el SO y la arquitectura del procesador?
Andrew De Andrade
44
@ AndrewDeAndrade Me da vergüenza exponer este código al público. pastebin.com/J66Lj6wf
Norman Ramsey
¿y qué tal uname -s?
Alexander Mills
35

Recomiendo usar este código bash completo

lowercase(){
    echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
}

OS=`lowercase \`uname\``
KERNEL=`uname -r`
MACH=`uname -m`

if [ "{$OS}" == "windowsnt" ]; then
    OS=windows
elif [ "{$OS}" == "darwin" ]; then
    OS=mac
else
    OS=`uname`
    if [ "${OS}" = "SunOS" ] ; then
        OS=Solaris
        ARCH=`uname -p`
        OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
    elif [ "${OS}" = "AIX" ] ; then
        OSSTR="${OS} `oslevel` (`oslevel -r`)"
    elif [ "${OS}" = "Linux" ] ; then
        if [ -f /etc/redhat-release ] ; then
            DistroBasedOn='RedHat'
            DIST=`cat /etc/redhat-release |sed s/\ release.*//`
            PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
            REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
        elif [ -f /etc/SuSE-release ] ; then
            DistroBasedOn='SuSe'
            PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
            REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
        elif [ -f /etc/mandrake-release ] ; then
            DistroBasedOn='Mandrake'
            PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
            REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
        elif [ -f /etc/debian_version ] ; then
            DistroBasedOn='Debian'
            DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F=  '{ print $2 }'`
            PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F=  '{ print $2 }'`
            REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F=  '{ print $2 }'`
        fi
        if [ -f /etc/UnitedLinux-release ] ; then
            DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
        fi
        OS=`lowercase $OS`
        DistroBasedOn=`lowercase $DistroBasedOn`
        readonly OS
        readonly DIST
        readonly DistroBasedOn
        readonly PSUEDONAME
        readonly REV
        readonly KERNEL
        readonly MACH
    fi

fi

más ejemplos ejemplos aquí: https://github.com/coto/server-easy-install/blob/master/lib/core.sh

coto
fuente
1
Dejaste la función en minúsculas, actualicé tu respuesta por ti.
Robin Clowers
1
Una vez que sepa que es Linux, si solo está hurgando (sin tratar de automatizar el descubrimiento), parece que el movimiento más fácil es simplemente ls /etcy buscar "blah-release", sea lo que sea bla, ese es el sistema operativo Linux: CentOS, Ubuntu , etc.
Chris Moschini
1
He editado porque algunas de las referencias a variables OS fueron escritos como "{$} SO" les ha cambiado a "$ {OS}" que es la manera correcta, lo probé
bazz
¿consideraría agregar "echo $ {OS}" al final del script?
Oleg Kokorin
10

En bash, use $OSTYPEy $HOSTTYPE, como se documenta; esto es lo que hago. Si eso no es suficiente, y si incluso unameu uname -a(u otras opciones apropiadas) no dan suficiente información, siempre está el script config.guess del proyecto GNU, hecho exactamente para este propósito.

Osito de peluche
fuente
10

Sugeriría evitar algunas de estas respuestas. No olvide que puede elegir otras formas de comparación de cadenas, lo que aclararía la mayoría de las variaciones, o el código feo que se ofrece.

Una de esas soluciones sería una simple verificación, como:

if [[ "$OSTYPE" =~ ^darwin ]]; then

Que tiene el beneficio adicional de hacer coincidir cualquier versión de Darwin, a pesar de su sufijo de versión. Esto también funciona para cualquier variación deLinux uno pueda esperar.

Puedes ver algunos ejemplos adicionales dentro de mis archivos de puntos aquí

Akiva
fuente
9

Intenta usar "uname". Por ejemplo, en Linux: "uname -a".

Según la página del manual, uname se ajusta a SVr4 y POSIX, por lo que debería estar disponible en Mac OS X y Cygwin , pero no puedo confirmarlo.

Por cierto: $ OSTYPE también está configurado linux-gnuaquí :)

Joao da Silva
fuente
Sin parámetros, uname imprime 'Darwin' en Mac OS X (leopard). Con -a, imprime mucha información adicional (versión del kernel, arquitectura y algo más que no puedo descifrar). No puedo probar en cygwin
David Rodríguez - dribeas
8

Escribí estos azúcares en mi .bashrc:

if_os () { [[ $OSTYPE == *$1* ]]; }
if_nix () { 
    case "$OSTYPE" in
        *linux*|*hurd*|*msys*|*cygwin*|*sua*|*interix*) sys="gnu";;
        *bsd*|*darwin*) sys="bsd";;
        *sunos*|*solaris*|*indiana*|*illumos*|*smartos*) sys="sun";;
    esac
    [[ "${sys}" == "$1" ]];
}

Entonces puedo hacer cosas como:

if_nix gnu && alias ls='ls --color=auto' && export LS_COLORS="..."
if_nix bsd && export CLICOLORS=on && export LSCOLORS="..."
if_os linux && alias psg="ps -FA | grep" #alternative to pgrep
if_nix bsd && alias psg="ps -alwx | grep -i" #alternative to pgrep
if_os darwin && alias finder="open -R"
kfix
fuente
Por cierto, estas 9 líneas funcionan en cualquier Bash que se ejecuta en casi cualquier cosa. Sin shellouts y funciona con casi cualquier estilo de .bashrc personal (grandes árboles anidados si / case o muchos alias aleatorios). OMI, le quita los pantalones a cada respuesta por encima de ella.
kfix
Hasta ahora, el más cercano a completar para incluir a Cygwin y otros BSD (básicamente compilación del popular * NIX)
HidekiAI
Complete para usuarios que son relevantes hoy y ejecute Bash. Los usuarios de AIX / HP-UX / IRIX / OpenVMS podrían intervenir. El nuevo subsistema de Windows para Linux ejecuta una instalación de Ubuntu amd64 de serie, por lo que debería ser cierto para ambos if_nix gnu& if_os linux.
kfix el
1
@kfix sí, es cierto, el subsistema win 10 bash genera "linux-gnu" para echo $OSTYPE. Para detectar específicamente el subsistema win 10 bash, la única solución que encontré fue buscar "Microsoft" en/proc/sys/kernel/osrelease
Jpnh
7
uname

o

uname -a

si quieres mas informacion

Federico A. Ramponi
fuente
7

Escribí una biblioteca personal de Bash y un marco de scripting que usa GNU shtool para hacer una detección de plataforma bastante precisa.

GNU shtool es un conjunto de scripts muy portátil que contiene, entre otras cosas útiles, el comando 'plataforma shtool'. Aquí está la salida de:

shtool platform -v -F "%sc (%ac) %st (%at) %sp (%ap)"

en algunas máquinas diferentes:

Mac OS X Leopard: 
    4.4BSD/Mach3.0 (iX86) Apple Darwin 9.6.0 (i386) Apple Mac OS X 10.5.6 (iX86)

Ubuntu Jaunty server:
    LSB (iX86) GNU/Linux 2.9/2.6 (i686) Ubuntu 9.04 (iX86)

Debian Lenny:
    LSB (iX86) GNU/Linux 2.7/2.6 (i686) Debian GNU/Linux 5.0 (iX86)

Esto produce resultados bastante satisfactorios, como puede ver. GNU shtool es un poco lento, por lo que en realidad almaceno y actualizo la identificación de la plataforma en un archivo en el sistema al que llaman mis scripts. Es mi marco, por lo que funciona para mí, pero su kilometraje puede variar.

Ahora, tendrá que encontrar una manera de empaquetar shtool con sus scripts, pero no es un ejercicio difícil. Siempre puede recurrir a la salida de uname, también.

EDITAR:

Me perdí la publicación de Teddy sobre config.guess(de alguna manera). Estos son scripts muy similares, pero no iguales. Yo personalmente uso shtool para otros usos también, y me ha funcionado bastante bien.

pistolas
fuente
7

Puedes usar lo siguiente:

OS=$(uname -s)

entonces puede usar la variable OS en su script.

Chetan kapoor
fuente
¿Puedes explicar cómo uname -ses diferente uname?
Alexander Mills
@AlexanderMills -s, --kernel-name imprime el nombre del kernel
Chetan kapoor
6

A continuación se muestra un enfoque para detectar el sistema operativo Linux basado en Debian y RedHat haciendo uso de / etc / lsb-release y / etc / os-release (dependiendo del sabor de Linux que esté usando) y tome una acción simple en función de ello.

#!/bin/bash
set -e

YUM_PACKAGE_NAME="python python-devl python-pip openssl-devel"
DEB_PACKAGE_NAME="python2.7 python-dev python-pip libssl-dev"

 if cat /etc/*release | grep ^NAME | grep CentOS; then
    echo "==============================================="
    echo "Installing packages $YUM_PACKAGE_NAME on CentOS"
    echo "==============================================="
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Red; then
    echo "==============================================="
    echo "Installing packages $YUM_PACKAGE_NAME on RedHat"
    echo "==============================================="
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Fedora; then
    echo "================================================"
    echo "Installing packages $YUM_PACKAGE_NAME on Fedorea"
    echo "================================================"
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Ubuntu; then
    echo "==============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Ubuntu"
    echo "==============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Debian ; then
    echo "==============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Debian"
    echo "==============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Mint ; then
    echo "============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Mint"
    echo "============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Knoppix ; then
    echo "================================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Kanoppix"
    echo "================================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 else
    echo "OS NOT DETECTED, couldn't install package $PACKAGE"
    exit 1;
 fi

exit 0

Ejemplo de salida para Ubuntu Linux:

delivery@delivery-E5450$ sudo sh detect_os.sh
[sudo] password for delivery: 
NAME="Ubuntu"
===============================================
Installing packages python2.7 python-dev python-pip libssl-dev on Ubuntu
===============================================
Ign http://dl.google.com stable InRelease
Get:1 http://dl.google.com stable Release.gpg [916 B]                          
Get:2 http://dl.google.com stable Release [1.189 B] 
...            
Exequiel Barrirero
fuente
5

Esto debería ser seguro de usar en todas las distribuciones.

$ cat /etc/*release

Esto produce algo como esto.

     DISTRIB_ID=LinuxMint
     DISTRIB_RELEASE=17
     DISTRIB_CODENAME=qiana
     DISTRIB_DESCRIPTION="Linux Mint 17 Qiana"
     NAME="Ubuntu"
     VERSION="14.04.1 LTS, Trusty Tahr"
     ID=ubuntu
     ID_LIKE=debian
     PRETTY_NAME="Ubuntu 14.04.1 LTS"
     VERSION_ID="14.04"
     HOME_URL="http://www.ubuntu.com/"
     SUPPORT_URL="http://help.ubuntu.com/"
     BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

Extraiga / asigne a las variables como desee

Nota: en algunas configuraciones. Esto también puede darle algunos errores que puede ignorar.

     cat: /etc/upstream-release: Is a directory
RJ
fuente
Nota: en CentOS, esto da[user@host ~]$ cat /etc/*release CentOS release 6.4 (Final) CentOS release 6.4 (Final) CentOS release 6.4 (Final)
cfstras
Sí, el resultado que publiqué fue un ejemplo, desde una de mis computadoras portátiles, no contenido estático que ves en todas partes.
RJ
Acabo de agregar que para que nadie piense que el resultado siempre está en la misma forma :)
cfstras
1
+1 Estoy usando set -e al comienzo del script (por lo tanto, esta solución no funciona doxer.org/linux-shell-centos-debian-ostype ). Y otras soluciones no son específicamente CentOS. Pero encontré esta referencia que demostró esta respuesta unix.stackexchange.com/a/92212
gihanchanuka
44
no funciona para Mac:cat: /etc/*release: No such file or directory
eridal
3

prueba esto:

DISTRO=$(cat /etc/*-release | grep -w NAME | cut -d= -f2 | tr -d '"')
echo "Determined platform: $DISTRO"
Alexander Nekrasov
fuente
En macOS me salecat: /etc/*-release: No such file or directory
csexton
@csexton realmente, estoy obteniendo lo mismo: zsh: no matches found: /etc/*release- esto funcionará solo para sistemas Linux, supongo ...
Alexander Nekrasov
Esta respuesta funciona solo para Linux, seguro. Pero otras respuestas son capaces de detectar Linux solo en oposición a otros sistemas. Este descubrimiento básico no está ayudando en absoluto para descubrir una distribución particular de Linux, es tan esencial como distinguir entre FreeBSD y Darwin.
Thomas Urban
3

Puede usar la siguiente cláusula if y expandirla según sea necesario:

if [ "${OSTYPE//[0-9.]/}" == "darwin" ]
then
    aminute_ago="-v-1M"
elif  [ "${OSTYPE//[0-9.]/}" == "linux-gnu" ]
then
    aminute_ago="-d \"1 minute ago\""
fi
Tahsin Turkoz
fuente
2

Probé los mensajes anteriores en algunas distribuciones de Linux y descubrí que lo siguiente funciona mejor para mí. Es una respuesta breve, concisa y exacta que funciona para Bash en Windows también.

OS=$(cat /etc/*release | grep ^NAME | tr -d 'NAME="') #$ echo $OS # Ubuntu
intellilogic
fuente
2
Si bien este fragmento de código es bienvenido y puede proporcionar algo de ayuda, mejoraría mucho si incluyera una explicación de cómo y por qué esto resuelve el problema. Recuerde que está respondiendo la pregunta para los lectores en el futuro, ¡no solo la persona que pregunta ahora! Por favor, editar su respuesta para agregar explicación y dar una indicación de lo que se aplican limitaciones y supuestos.
Toby Speight
1
Parece agradable y conciso para la mayoría de los sistemas Linux, pero desafortunadamente esto provocará un error en macOS. Quizás esto es más "detectar el sabor de distribución de Linux de Bash
csexton
1
@csexton OS=$( ([[ -f /etc/*release ]] && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || echo "Unknown" )esto funcionará sin arrojar errores.
Kuzeko
En realidad, aquí hay una forma correctaOS=$( $(compgen -G "/etc/*release" > /dev/null) && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || $( echo "${OSTYPE//[0-9.]/}")
Kuzeko, el
@ Kuzeko Lamentablemente, todavía recibo errores al ejecutar esto en macOS.
csexton
1

Tiendo a mantener mi .bashrc y .bash_alias en un archivo compartido al que todas las plataformas pueden acceder. Así es como conquisto el problema en mi .bash_alias:

if [[ -f (name of share)/.bash_alias_$(uname) ]]; then
    . (name of share)/.bash_alias_$(uname)
fi

Y tengo, por ejemplo, un .bash_alias_Linux con:

alias ls='ls --color=auto'

De esta manera mantengo el código específico de la plataforma y el portátil por separado, puede hacer lo mismo para .bashrc

ericcurtin
fuente
1

Esto comprueba un montón de knownarchivos para identificar si la distribución de Linux es Debian o Ubunu, luego se establece de manera predeterminada en la $OSTYPEvariable.

os='Uknown'
unamestr="${OSTYPE//[0-9.]/}"
os=$( compgen -G "/etc/*release" > /dev/null  && cat /etc/*release | grep ^NAME | tr -d 'NAME="'  ||  echo "$unamestr")

echo "$os"
Kuzeko
fuente
-1

Hacer lo siguiente ayudó a realizar la verificación correctamente para ubuntu:

if [[ "$OSTYPE" =~ ^linux ]]; then
    sudo apt-get install <some-package>
fi
sandman
fuente
44
¿Qué pasa con otros sistemas Linux que no usan apt-get?
Wilf
ubuntu es una distribución, no una clase de sistema operativo.
jitter