655 votes

Détecter le système d'exploitation à partir d'un script Bash

Je tiens à garder mon .bashrc et .bash_login fichiers dans le contrôle de version pour que je puisse les utiliser entre tous les ordinateurs que j'utilise. Le problème est que j'ai quelques OS spécifique alias alors que je cherchais un moyen pour déterminer si le script est en cours d'exécution sur Mac OS X, Linux ou Cygwin.

Quelle est la bonne façon de détecter le système d'exploitation dans un Bash script?

705voto

Timmmm Points 9909

Je pense que la suite devrait fonctionner. Je ne suis pas sûr de l' freebsd et win32 , quoique.

if [[ "$OSTYPE" == "linux-gnu" ]]; then
        # ...
elif [[ "$OSTYPE" == "darwin"* ]]; then
        # ...
elif [[ "$OSTYPE" == "cygwin" ]]; then
        # ...
elif [[ "$OSTYPE" == "win32" ]]; then
        # ...
elif [[ "$OSTYPE" == "freebsd"* ]]; then
        # ...
else
        # Unknown.
fi

305voto

Nicolas Martyanoff Points 1102

Pour mon .bashrc, j'utilise le code suivant:

platform='unknown'
unamestr=`uname`
if [[ "$unamestr" == 'Linux' ]]; then
   platform='linux'
elif [[ "$unamestr" == 'FreeBSD' ]]; then
   platform='freebsd'
fi

Puis-je faire des choses comme:

if [[ $platform == 'linux' ]]; then
   alias ls='ls --color=auto'
elif [[ $platform == 'freebsd' ]]; then
   alias ls='ls -G'
fi

C'est moche, mais ça fonctionne (vous pouvez utiliser le " cas "au lieu de "si", si vous préférez).

287voto

La page de manuel de bash dit que la variable OSTYPE stocke le nom du système d'exploitation:

OSTYPE Automatiquement réglé sur une chaîne qui décrit le système d'exploitation sur lequel bash est en cours d'exécution. La valeur par défaut est le système dépendante.

Il est mis à l' linux-gnu ici.

199voto

kenorb Points 2464

Vous pouvez tout simplement utiliser les pré-défini $OSTYPE variable ie.:

case "$OSTYPE" in
  solaris*) echo "SOLARIS" ;;
  darwin*)  echo "OSX" ;; 
  linux*)   echo "LINUX" ;;
  bsd*)     echo "BSD" ;;
  *)        echo "unknown: $OSTYPE" ;;
esac

Une autre méthode consiste à détecter plate-forme basée sur uname commande.

Voir le script suivant (prêt à l'inclure dans .bashrc):

# Detect the platform (similar to $OSTYPE)
OS="`uname`"
case $OS in
  'Linux')
    OS='Linux'
    alias ls='ls --color=auto'
    ;;
  'FreeBSD')
    OS='FreeBSD'
    alias ls='ls -G'
    ;;
  'WindowsNT')
    OS='Windows'
    ;;
  'darwin') 
    OS='Mac'
    ;;
  'SunOS')
    OS='Solaris'
    ;;
  'AIX') ;;
  *) ;;
esac

Pour d'autres idées, merci de voir mes fichiers de configuration utilisateur sur GitHub.

41voto

Norman Ramsey Points 115730

La détection de système d'exploitation et le type de PROCESSEUR n'est pas si facile de le faire de façon portable. J'ai un sh script d'environ 100 lignes qui fonctionne sur une très grande variété de plates-formes Unix: tout système que j'ai utilisé depuis 1988.

Les éléments clés sont

  • uname -p est le type de processeur , mais il est habituellement unknown sur le moderne, les plates-formes Unix.

  • uname -m donnera le "matériel de la machine nom" sur certains systèmes Unix.

  • /bin/arch, si elle existe, donne généralement le type de processeur.

  • uname sans arguments le nom du système d'exploitation.

Finalement, vous aurez à réfléchir sur la distinction entre les plates-formes et des détails que vous le souhaitez. Par exemple, juste pour garder les choses simples, j'traiter i386 par i686 , tout "Pentium*" et tout "AMD*Athlon*" tout comme x86.

Mon ~/.profile exécute un script au démarrage qui définit une variable une chaîne de caractères indiquant la combinaison du PROCESSEUR et du système d'exploitation. J'ai de la plateforme bin, man, lib, et include répertoires que vous mettre en place sur cette base. Puis j'ai mis une cargaison de variables d'environnement. Ainsi, par exemple, un script shell pour reformater le courrier peut appeler, par exemple, $LIB/mailfmt qui est une plate-forme spécifique binaire exécutable.

Si vous voulez couper les coins ronds, uname -m et le plain - uname vais vous dire ce que vous voulez savoir sur de nombreuses plateformes. Ajoutez d'autres choses quand vous en avez besoin. (Et l'utilisation de case, pas nesteed if!)

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