Por lo general, uname
con sus diversas opciones le dirá en qué entorno se está ejecutando:
pax> uname -a
CYGWIN_NT-5.1 IBM-L3F3936 1.5.25(0.156/4/2) 2008-06-12 19:34 i686 Cygwin
pax> uname -s
CYGWIN_NT-5.1
Y, de acuerdo con lo muy útil schot
(en los comentarios), uname -s
da Darwin
para OSX y Linux
para Linux, mientras que mi Cygwin da CYGWIN_NT-5.1
. Pero es posible que tenga que experimentar con todo tipo de versiones diferentes.
Entonces, el bash
código para hacer tal verificación estaría en la línea de:
unameOut="$(uname -s)"
case "${unameOut}" in
Linux*) machine=Linux;;
Darwin*) machine=Mac;;
CYGWIN*) machine=Cygwin;;
MINGW*) machine=MinGw;;
*) machine="UNKNOWN:${unameOut}"
esac
echo ${machine}
Tenga en cuenta que estoy asumiendo aquí que en realidad está ejecutando dentro de CygWin (el bash
caparazón), por lo que las rutas ya deberían estar configuradas correctamente. Como señala un comentarista, puede ejecutar el bash
programa, pasando el script, por cmd
sí mismo y esto puede provocar que las rutas no se configuren según sea necesario.
Si usted está haciendo eso, es su responsabilidad de asegurar las correctas ejecutables (es decir, los CygWin) están siendo llamados, posiblemente mediante la modificación de la ruta de antemano o especificando en detalle los sitios ejecutables (por ejemplo, /c/cygwin/bin/uname
).
MINGW32_NT-6.1
. Además, no hay/cygdrive
prefijo, solo/c
paraC:
.How can a shell/bash script detect ...
y la otra sí.uname -s
termina llamando a lo que seauname
primero en su ruta actual, que en mi sistema resulta ser la versión instalada con lageda
que devuelve el textoWindowsNT
. Sin embargo, también podría ser la versión MinGW como se describió anteriormente. Una detección confiable para cygwin no debe depender de que la ruta se establezca adecuadamente, IMO. Por lo tanto,$(uname -s)
debe cambiarse$(/bin/uname -s)
para detectar cygwin.Aquí está el script bash que utilicé para detectar tres tipos diferentes de SO (GNU / Linux, Mac OS X, Windows NT)
Presta atención
#!/usr/bin/env bash
lugar de#!/bin/sh
evitar el problema causado por el/bin/sh
enlace a un shell predeterminado diferente en diferentes plataformas, o habrá un error como operador inesperado , eso es lo que sucedió en mi computadora (Ubuntu 64 bits 12.04).expr
programa a menos que lo instales, así que solo lo usouname
.Diseño
uname
para obtener la información del sistema (-s
parámetro).expr
ysubstr
para lidiar con la cuerda.if
elif
fi
para hacer el trabajo correspondiente.uname -s
especificaciones.Implementación
Pruebas
Que aprendí
Referencias
fuente
[ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]
."$(expr substr $(uname -s) 1 5)"
es un poco extraña. Hay formas más bonitas de hacerlo, por ejemplo:if [ `uname -s` == CYGWIN* ]; then
. Léalo: siuname -s
comienza con CYGWIN entonces ...if [[ $(uname -s) == CYGWIN* ]]; then
uname -s
se obtenga algo diferente a "Linux"?Use
uname -s
(--kernel-name
) porqueuname -o
(--operating-system
) no es compatible con algunos sistemas operativos como Mac OS y Solaris . También puede usarlouname
sin ningún argumento, ya que el argumento predeterminado es-s
(--kernel-name
).El siguiente fragmento no requiere intento(es decir, no requiere
#!/bin/bash
)Lo siguiente
Makefile
está inspirado en el proyecto Git (config.mak.uname
) .Vea también esta respuesta completa sobre
uname -s
yMakefile
.La tabla de correspondencia en la parte inferior de esta respuesta es del artículo de Wikipedia sobre
uname
. Contribuya a mantenerlo actualizado (edite la respuesta o publique un comentario). También puede actualizar el artículo de Wikipedia y publicar un comentario para notificarme sobre su contribución ;-)Operating System
uname -s
Mac OS X
Darwin
Cygwin 32-bit (Win-XP)
CYGWIN_NT-5.1
Cygwin 32-bit (Win-7 32-bit)
CYGWIN_NT-6.1
Cygwin 32-bit (Win-7 64-bit)
CYGWIN_NT-6.1-WOW64
Cygwin 64-bit (Win-7 64-bit)
CYGWIN_NT-6.1
MinGW (Windows 7 32-bit)
MINGW32_NT-6.1
MinGW (Windows 10 64-bit)
MINGW64_NT-10.0
Interix (Services for UNIX)
Interix
MSYS
MSYS_NT-6.1
MSYS2
MSYS_NT-10.0-17763
Windows Subsystem for Linux
Linux
Android
Linux
coreutils
Linux
CentOS
Linux
Fedora
Linux
Gentoo
Linux
Red Hat Linux
Linux
Linux Mint
Linux
openSUSE
Linux
Ubuntu
Linux
Unity Linux
Linux
Manjaro Linux
Linux
OpenWRT r40420
Linux
Debian (Linux)
Linux
Debian (GNU Hurd)
GNU
Debian (kFreeBSD)
GNU/kFreeBSD
FreeBSD
FreeBSD
NetBSD
NetBSD
DragonFlyBSD
DragonFly
Haiku
Haiku
NonStop
NONSTOP_KERNEL
QNX
QNX
ReliantUNIX
ReliantUNIX-Y
SINIX
SINIX-Y
Tru64
OSF1
Ultrix
ULTRIX
IRIX 32 bits
IRIX
IRIX 64 bits
IRIX64
MINIX
Minix
Solaris
SunOS
UWIN (64-bit Windows 7)
UWIN-W7
SYS$UNIX:SH on OpenVMS
IS/WB
z/OS USS
OS/390
Cray
sn5176
(SCO) OpenServer
SCO_SV
(SCO) System V
SCO_SV
(SCO) UnixWare
UnixWare
IBM AIX
AIX
IBM i with QSH
OS400
HP-UX
HP-UX
fuente
~/.profile
(para establecer variables de entorno como$PATH
: comentar para proporcionar palabras clave de búsqueda para la posteridad).uname -sr
y compararLinux*Microsoft)
antesLinux*)
.Bash establece la variable de shell OSTYPE. De
man bash
:Esto tiene una pequeña ventaja,
uname
ya que no requiere el lanzamiento de un nuevo proceso, por lo que será más rápido de ejecutar.Sin embargo, no puedo encontrar una lista autorizada de valores esperados. Para mí en Ubuntu 14.04 está configurado en 'linux-gnu'. He raspado la web en busca de otros valores. Por lo tanto:
Los asteriscos son importantes en algunos casos; por ejemplo, OSX agrega un número de versión del sistema operativo después del 'darwin'. Me han dicho que el valor 'ganar' es en realidad 'win32', ¿tal vez haya un 'win64'?
Quizás podríamos trabajar juntos para completar una tabla de valores verificados aquí:
linux-gnu
cygwin
msys
(Agregue su valor si difiere de las entradas existentes)
fuente
env | grep OSTYPE
, pero lo verá debajoset | grep OSTYPE
OSTYPE
variable de Bash (conftypes.h) se configura en tiempo de compilación utilizando la copia exacta de laOS
variable de automake (Makefile.in) . Se puede consultar el archivo lib / config.sub de automake para ver todos los tipos disponibles.Para construir sobre la respuesta de Albert, me gusta usar
$COMSPEC
para detectar Windows:Esto evita las variantes de análisis de nombres de Windows
$OS
y las variantes de análisisuname
como MINGW, Cygwin, etc.Antecedentes:
%COMSPEC%
es una variable de entorno de Windows que especifica la ruta completa al procesador de comandos (también conocido como el shell de Windows). El valor de esta variable es típicamente%SystemRoot%\system32\cmd.exe
, que generalmente se evalúaC:\Windows\system32\cmd.exe
.fuente
Si los 6 primeros caracteres del comando uname -s son "CYGWIN", se supone un sistema cygwin
fuente
if [ `uname -s` == CYGWIN* ]; then
se ve mejor y funciona igual.[[ $(uname -s) == CYGWIN* ]]
. Tenga en cuenta también que las expresiones regulares extendidas son más precisos en nuestro caso:[[ $(uname -s) =~ ^CYGWIN* ]]
.expr substr $(uname -s) 1 6
da un error (expr: syntax error
) en macOS.Ok, aquí está mi camino.
p.ej
Lo uso en mis archivos de puntos
fuente
http://en.wikipedia.org/wiki/Uname
Toda la información que necesitarás. Google es tu amigo.
Use
uname -s
para consultar el nombre del sistema.Darwin
CYGWIN_...
LINUX
para la mayoríafuente
El subsistema de Windows para Linux no existía cuando se hizo esta pregunta. Dio estos resultados en mi prueba:
Esto significa que necesita uname -r para distinguirlo de Linux nativo.
fuente
Supongo que la respuesta única es inmejorable, principalmente en términos de limpieza.
Aunque lleva un tiempo ridículo ejecutarlo, descubrí que probar la presencia de archivos específicos también me da resultados buenos y más rápidos, ya que no estoy invocando un ejecutable:
Entonces,
[ -f /usr/bin/cygwin1.dll ] && echo Yep, Cygwin running
solo usa una comprobación rápida de presencia de archivos Bash. Como estoy en Windows en este momento, no puedo decirte ningún archivo específico para Linux y Mac OS X, pero estoy bastante seguro de que existen. :-)
fuente
Use solo esto desde la línea de comandos funciona muy bien, gracias a Justin:
fuente
fuente