Por lo general, unamecon 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 -sda Darwinpara OSX y Linuxpara 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 bashcó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 bashcaparazón), por lo que las rutas ya deberían estar configuradas correctamente. Como señala un comentarista, puede ejecutar el bashprograma, pasando el script, por cmdsí 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/cygdriveprefijo, solo/cparaC:.How can a shell/bash script detect ...y la otra sí.uname -stermina llamando a lo que seaunameprimero en su ruta actual, que en mi sistema resulta ser la versión instalada con lagedaque 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 bashlugar de#!/bin/shevitar el problema causado por el/bin/shenlace 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).exprprograma a menos que lo instales, así que solo lo usouname.Diseño
unamepara obtener la información del sistema (-sparámetro).exprysubstrpara lidiar con la cuerda.ifeliffipara hacer el trabajo correspondiente.uname -sespecificaciones.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 -scomienza con CYGWIN entonces ...if [[ $(uname -s) == CYGWIN* ]]; thenuname -sse 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 usarlounamesin 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
Makefileestá inspirado en el proyecto Git (config.mak.uname) .Vea también esta respuesta completa sobre
uname -syMakefile.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 Systemuname -sMac OS XDarwinCygwin 32-bit (Win-XP)CYGWIN_NT-5.1Cygwin 32-bit (Win-7 32-bit)CYGWIN_NT-6.1Cygwin 32-bit (Win-7 64-bit)CYGWIN_NT-6.1-WOW64Cygwin 64-bit (Win-7 64-bit)CYGWIN_NT-6.1MinGW (Windows 7 32-bit)MINGW32_NT-6.1MinGW (Windows 10 64-bit)MINGW64_NT-10.0Interix (Services for UNIX)InterixMSYSMSYS_NT-6.1MSYS2MSYS_NT-10.0-17763Windows Subsystem for LinuxLinuxAndroidLinuxcoreutilsLinuxCentOSLinuxFedoraLinuxGentooLinuxRed Hat LinuxLinuxLinux MintLinuxopenSUSELinuxUbuntuLinuxUnity LinuxLinuxManjaro LinuxLinuxOpenWRT r40420LinuxDebian (Linux)LinuxDebian (GNU Hurd)GNUDebian (kFreeBSD)GNU/kFreeBSDFreeBSDFreeBSDNetBSDNetBSDDragonFlyBSDDragonFlyHaikuHaikuNonStopNONSTOP_KERNELQNXQNXReliantUNIXReliantUNIX-YSINIXSINIX-YTru64OSF1UltrixULTRIXIRIX 32 bitsIRIXIRIX 64 bitsIRIX64MINIXMinixSolarisSunOSUWIN (64-bit Windows 7)UWIN-W7SYS$UNIX:SH on OpenVMSIS/WBz/OS USSOS/390Craysn5176(SCO) OpenServerSCO_SV(SCO) System VSCO_SV(SCO) UnixWareUnixWareIBM AIXAIXIBM i with QSHOS400HP-UXHP-UXfuente
~/.profile(para establecer variables de entorno como$PATH: comentar para proporcionar palabras clave de búsqueda para la posteridad).uname -sry compararLinux*Microsoft)antesLinux*).Bash establece la variable de shell OSTYPE. De
man bash:Esto tiene una pequeña ventaja,
unameya 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-gnucygwinmsys(Agregue su valor si difiere de las entradas existentes)
fuente
env | grep OSTYPE, pero lo verá debajoset | grep OSTYPEOSTYPEvariable de Bash (conftypes.h) se configura en tiempo de compilación utilizando la copia exacta de laOSvariable 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
$COMSPECpara detectar Windows:Esto evita las variantes de análisis de nombres de Windows
$OSy las variantes de análisisunamecomo 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* ]; thense 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 6da 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 -spara consultar el nombre del sistema.DarwinCYGWIN_...LINUXpara 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 runningsolo 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