471 votes

Comment vérifier si elle fonctionne sous Cygwin, Mac ou Linux ?

J'ai un shell script qui est utilisé à la fois sur Windows/Cygwin et Mac et Linux. Il a besoin de variables légèrement différentes pour chaque version.

Comment un shell/bash script peut-il détecter s'il s'exécute dans Cygwin, sur un Mac ou dans Linux ?

479voto

paxdiablo Points 341644

Habituellement, uname et ses différentes options vous indiqueront dans quel environnement vous évoluez :

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

Et, selon le très utile schot (dans les commentaires), uname -s donne Darwin pour OSX et Linux pour Linux, alors que mon Cygwin donne CYGWIN_NT-5.1 . Mais vous devrez peut-être expérimenter toutes sortes de versions différentes.

Ainsi, le bash Le code permettant d'effectuer une telle vérification serait du type suivant :

unameOut="$(uname -s)"
case "${unameOut}" in
    Linux*)     machine=Linux;;
    Darwin*)    machine=Mac;;
    CYGWIN*)    machine=Cygwin;;
    MINGW*)     machine=MinGw;;
    *)          machine="UNKNOWN:${unameOut}"
esac
echo ${machine}

Notez que je suppose ici que vous exécutez réellement sur CygWin (le bash ) donc les chemins devraient déjà être correctement configurés. Comme le note un commentateur, vous pouvez exécuter la commande bash programme, en passant le script, de cmd et cela peut avoir pour conséquence que les chemins ne sont pas configurés comme il se doit.

Si vous sont En faisant cela, il est de votre responsabilité de vous assurer que les bons exécutables (c'est-à-dire ceux de CygWin) sont appelés, éventuellement en modifiant le chemin au préalable ou en spécifiant complètement l'emplacement des exécutables (par exemple, /c/cygwin/bin/uname ).

14 votes

Parfois, moins est plus ;) BTW, Wikipedia propose un tableau d'exemples de sortie de uname à l'adresse suivante fr.wikipedia.org/wiki/Unom

1 votes

La sortie de Git Bash uname -s sous Windows 7 est la suivante MINGW32_NT-6.1 . De plus, il n'y a pas /cygdrive préfixe, juste /c para C: .

9 votes

Git Bash n'est pas Cygwin. C'est MinGW, minimal GNU pour MS Windows, ce qui explique pourquoi le comportement est différent.

398voto

Albert Points 1651

Voici le script bash que j'ai utilisé pour détecter trois types de systèmes d'exploitation différents (GNU/Linux, Mac OS X, Windows NT)

Soyez attentif

  • Dans votre script bash, utilisez #!/usr/bin/env bash au lieu de #!/bin/sh pour éviter le problème causé par /bin/sh lié à un shell par défaut différent sur les différentes plateformes, ou il y aura une erreur du type opérateur inattendu C'est ce qui s'est passé sur mon ordinateur (Ubuntu 64 bits 12.04).
  • Mac OS X 10.6.8 (Snow Leopard) n'ont pas de expr à moins que vous ne l'installiez, donc j'utilise simplement le programme uname .

Design

  1. Utilisez uname pour obtenir les informations sur le système ( -s paramètre).
  2. Utilisez expr y substr pour s'occuper de la chaîne.
  3. Utilisez if elif fi pour faire le travail correspondant.
  4. Vous pouvez ajouter plus de support système si vous le souhaitez, il suffit de suivre les instructions de la page uname -s spécification.

Mise en œuvre

#!/usr/bin/env bash

if [ "$(uname)" == "Darwin" ]; then
    # Do something under Mac OS X platform        
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
    # Do something under GNU/Linux platform
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]; then
    # Do something under 32 bits Windows NT platform
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then
    # Do something under 64 bits Windows NT platform
fi

Essais

  • Linux (Ubuntu 12.04 LTS, Kernel 3.2.0) testé OK.
  • OS X (10.6.8 Snow Leopard) a été testé correctement.
  • Windows (Windows 7 64 bit) testé OK.

Ce que j'ai appris

  1. Vérifiez les guillemets d'ouverture et de fermeture.
  2. Vérifiez s'il manque des parenthèses et des accolades {}.

Références

0 votes

Pour MinGW, il peut être plus judicieux de vérifier : [ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ] .

2 votes

@Albert : expression "$(expr substr $(uname -s) 1 5)" est un peu bizarre. Il y a des façons plus jolies de faire ça, par exemple : if [ `uname -s` == CYGWIN* ]; then . Lisez-le : si uname -s commence par CYGWIN alors...

12 votes

@DawidFerenczy Je crois que cela nécessiterait des doubles crochets comme if [[ $(uname -s) == CYGWIN* ]]; then

13voto

Jan Helge Points 61
# This script fragment emits Cygwin rulez under bash/cygwin
if [[ $(uname -s) == CYGWIN* ]];then
    echo Cygwin rulez
else 
    echo Unix is king
fi

Si les 6 premiers caractères de la commande uname -s sont "CYGWIN", un système cygwin est supposé exister.

0 votes

if [ `uname -s` == CYGWIN* ]; then est plus beau et fonctionne de la même manière.

6 votes

Oui, mais utilisez des doubles parenthèses : [[ $(uname -s) == CYGWIN* ]] . Notez également que les expressions régulières étendues sont plus précises dans notre cas : [[ $(uname -s) =~ ^CYGWIN* ]] .

0 votes

Ce qui précède fonctionne mieux, car expr substr $(uname -s) 1 6 donne une erreur ( expr: syntax error ) sur macOS.

10voto

Steve Jansen Points 1990

Pour développer la réponse d'Albert, j'aime utiliser $COMSPEC pour détecter Windows :

#!/bin/bash

if [ "$(uname)" == "Darwin" ]
then
 echo Do something under Mac OS X platform
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]
then
  echo Do something under Linux platform
elif [ -n "$COMSPEC" -a -x "$COMSPEC" ]
then 
  echo $0: this script does not support Windows \:\(
fi

Cela permet d'éviter d'analyser les variantes des noms de Windows pour les éléments suivants $OS et les variantes d'analyse syntaxique de uname comme MINGW, Cygwin, etc.

Le contexte : %COMSPEC% est une variable d'environnement Windows spécifiant le chemin d'accès complet au processeur de commande (alias le shell Windows). La valeur de cette variable est généralement %SystemRoot%\system32\cmd.exe qui est généralement évalué à C:\Windows\system32\cmd.exe .

1 votes

Ce n'est plus correct, car $COMSPEC n'est pas défini lorsqu'il est exécuté dans l'environnement Windows UWS Bash.

5voto

rubenvb Points 27271

http://en.wikipedia.org/wiki/Uname

Toutes les informations dont vous aurez besoin. Google est votre ami.

Utilisez uname -s pour demander le nom du système.

  • Mac : Darwin
  • Cygwin : CYGWIN_...
  • Linux : divers, LINUX pour la plupart

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X