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 ?
bash
os-detection
csexton
fuente
fuente

Respuestas:
Creo que lo siguiente debería funcionar. Aunque no estoy seguro
win32.fuente
msyspara Git Bash / msysGit, ycygwinpara Cygwinmsys;.source somefile ;, obtengosyntax error near unexpected token elif.Para mi .bashrc, uso el siguiente código:
Luego hago cosas como:
Es feo, pero funciona. Puede usar en
caselugar deifsi lo prefiere.fuente
platform="$(uname | tr '[:upper:]' '[:lower:]')"y luego manejar definitivamente un caso? Simplemente parece extraño codificar una dependencia en una salida muy específica.La página de manual de bash dice que la variable OSTYPE almacena el nombre del sistema operativo:
Está configurado para
linux-gnuaquí.fuente
os=${OSTYPE//[0-9.]/}case $OSTYPE in darwin*) echo I am a Mac ;; esacif [[ $OSTYPE == darwin* ]]; then echo I am a Mac;fi$OSTYPESimplemente puede usar una
$OSTYPEvariable predefinida , por ejemplo:Sin embargo, no es reconocido por los shells más antiguos (como el shell Bourne ).
unameOtro método es detectar la plataforma en función del
unamecomando.Consulte el siguiente script (listo para incluir en .bashrc):
Puedes encontrar algún ejemplo práctico en mi
.bashrc.Aquí hay una versión similar utilizada en Travis CI :
fuente
uname, Oracle ha pasado por alto la convención y ha puesto una cadena de versión gratuita con suOSTYPE ==> solaris2.11.unamees un poco más limpio y menos trabajo que hacer.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 encuentraunknownen las plataformas modernas de Unix.uname -mdará el "nombre de hardware de la máquina" en algunos sistemas Unix./bin/arch, si existe, generalmente dará el tipo de procesador.unamesin 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 dei686cualquier "Pentium*" y cualquier "AMD*Athlon*" como todox86.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íficabin,man,lib, yincludedirectorios 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/mailfmtque es un binario ejecutable específico de la plataforma.Si desea cortar esquinas ,
uname -my plainunamele dirá lo que quiere saber en muchas plataformas. Agregue otras cosas cuando lo necesite. (¡Y usarcase, no anidadoif!)fuente
uname -s?Recomiendo usar este código bash completo
más ejemplos ejemplos aquí: https://github.com/coto/server-easy-install/blob/master/lib/core.sh
fuente
ls /etcy buscar "blah-release", sea lo que sea bla, ese es el sistema operativo Linux: CentOS, Ubuntu , etc.En bash, use
$OSTYPEy$HOSTTYPE, como se documenta; esto es lo que hago. Si eso no es suficiente, y si inclusounameuuname -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.fuente
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 ]]; thenQue 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 de
Linuxuno pueda esperar.Puedes ver algunos ejemplos adicionales dentro de mis archivos de puntos aquí
fuente
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í :)fuente
Escribí estos azúcares en mi
.bashrc:Entonces puedo hacer cosas como:
fuente
if_nix gnu&if_os linux.echo $OSTYPE. Para detectar específicamente el subsistema win 10 bash, la única solución que encontré fue buscar "Microsoft" en/proc/sys/kernel/osreleaseo
si quieres mas informacion
fuente
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:
en algunas máquinas diferentes:
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.fuente
Puedes usar lo siguiente:
entonces puede usar la variable OS en su script.
fuente
uname -ses diferenteuname?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.
Ejemplo de salida para Ubuntu Linux:
fuente
Esto debería ser seguro de usar en todas las distribuciones.
Esto produce algo como esto.
Extraiga / asigne a las variables como desee
Nota: en algunas configuraciones. Esto también puede darle algunos errores que puede ignorar.
fuente
[user@host ~]$ cat /etc/*release CentOS release 6.4 (Final) CentOS release 6.4 (Final) CentOS release 6.4 (Final)cat: /etc/*release: No such file or directoryprueba esto:
fuente
cat: /etc/*-release: No such file or directoryzsh: no matches found: /etc/*release- esto funcionará solo para sistemas Linux, supongo ...Puede usar la siguiente cláusula if y expandirla según sea necesario:
fuente
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.
fuente
OS=$( ([[ -f /etc/*release ]] && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || echo "Unknown" )esto funcionará sin arrojar errores.OS=$( $(compgen -G "/etc/*release" > /dev/null) && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || $( echo "${OSTYPE//[0-9.]/}")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:
Y tengo, por ejemplo, un .bash_alias_Linux con:
De esta manera mantengo el código específico de la plataforma y el portátil por separado, puede hacer lo mismo para .bashrc
fuente
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.fuente
Hacer lo siguiente ayudó a realizar la verificación correctamente para ubuntu:
fuente