Me gustaría mantener mis archivos .bashrc
y .bash_login
en 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
msys
para Git Bash / msysGit, ycygwin
para 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
case
lugar deif
si 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-gnu
aquí.fuente
os=${OSTYPE//[0-9.]/}
case $OSTYPE in darwin*) echo I am a Mac ;; esac
if [[ $OSTYPE == darwin* ]]; then echo I am a Mac;fi
$OSTYPE
Simplemente puede usar una
$OSTYPE
variable predefinida , por ejemplo: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
uname
comando.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
.uname
es 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
sh
script 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 -p
es del tipo de procesador pero generalmente se encuentraunknown
en 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
i386
través dei686
cualquier "Pentium*
" y cualquier "AMD*Athlon*
" como todox86
.My
~/.profile
ejecuta 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
, yinclude
directorios 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 -m
y plainuname
le 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 /etc
y buscar "blah-release", sea lo que sea bla, ese es el sistema operativo Linux: CentOS, Ubuntu , etc.En bash, use
$OSTYPE
y$HOSTTYPE
, como se documenta; esto es lo que hago. Si eso no es suficiente, y si inclusouname
uuname -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 ]]; 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 de
Linux
uno 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-gnu
aquí :)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/osrelease
o
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 -s
es 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 directory
prueba esto:
fuente
cat: /etc/*-release: No such file or directory
zsh: 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
known
archivos para identificar si la distribución de Linux es Debian o Ubunu, luego se establece de manera predeterminada en la$OSTYPE
variable.fuente
Hacer lo siguiente ayudó a realizar la verificación correctamente para ubuntu:
fuente