Je souhaite conserver mes fichiers .bashrc
et .bash_login
sous contrôle de version afin de pouvoir les utiliser entre tous les ordinateurs que j'utilise. Le problème est que j'ai des alias spécifiques au système d'exploitation, donc je cherchais un moyen de déterminer si le script s'exécute sur Mac OS X, Linux ou Cygwin .
Quelle est la bonne façon de détecter le système d'exploitation dans un script Bash ?
bash
os-detection
csexton
la source
la source
Réponses:
Je pense que ce qui suit devrait fonctionner. Je ne suis pas sûr
win32
cependant.la source
msys
pour Git Bash / msysGit etcygwin
pour Cygwinmsys
;
.source somefile ;
, j'obtienssyntax error near unexpected token elif
.Pour mon .bashrc, j'utilise le code suivant:
Ensuite, je fais des choses comme:
C'est moche, mais ça marche. Vous pouvez utiliser
case
au lieu deif
si vous préférez.la source
platform="$(uname | tr '[:upper:]' '[:lower:]')"
puis de le gérer définitivement dans une affaire? Il semble juste bizarre de coder en dur une dépendance à une sortie très spécifique.La page de manuel bash indique que la variable OSTYPE stocke le nom du système d'exploitation:
C'est réglé
linux-gnu
ici.la source
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
Vous pouvez simplement utiliser une
$OSTYPE
variable prédéfinie , par exemple:Cependant, il n'est pas reconnu par les coquilles plus anciennes (comme la coquille Bourne ).
uname
Une autre méthode consiste à détecter la plateforme sur la base d'une
uname
commande.Voir le script suivant (prêt à être inclus dans .bashrc):
Vous pouvez trouver un exemple pratique dans mon
.bashrc
.Voici une version similaire utilisée sur Travis CI :
la source
uname
, Oracle a glissé la convention et a mis une chaîne de version gratuite avec leurOSTYPE ==> solaris2.11
.uname
est un peu plus propre et moins de travail à faire.Détecter le système d'exploitation et le type de CPU n'est pas si facile à faire de manière 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'utilise depuis 1988.Les éléments clés sont
uname -p
est de type processeur, mais se trouve généralementunknown
sur les plateformes Unix modernes.uname -m
donnera le "nom du matériel de la machine" sur certains systèmes Unix./bin/arch
, s'il existe, donnera généralement le type de processeur.uname
sans argument nommera le système d'exploitation.Finalement, vous devrez penser aux distinctions entre les plates-formes et à quel point vous voulez les faire. Par exemple, juste pour garder les choses simples de, je traite à
i386
traversi686
, tout «Pentium*
» et tout «AMD*Athlon*
» tout commex86
.My
~/.profile
exécute un script au démarrage qui définit une variable sur une chaîne indiquant la combinaison du processeur et du système d'exploitation. Je plate-forme spécifiquebin
,man
,lib
et lesinclude
répertoires qui se mettent en place sur cette base. Ensuite, j'ai défini une cargaison de variables d'environnement. Ainsi, par exemple, un script shell pour reformater le courrier peut appeler, par exemple,$LIB/mailfmt
qui est un binaire exécutable spécifique à la plate-forme.Si vous voulez couper les coins ronds ,
uname -m
plainuname
vous dira ce que vous voulez savoir sur de nombreuses plateformes. Ajoutez d'autres éléments lorsque vous en avez besoin. (Et utilisezcase
, pas imbriquéif
!)la source
uname -s
?Je recommande d'utiliser ce code bash complet
plus d'exemples d'exemples ici: https://github.com/coto/server-easy-install/blob/master/lib/core.sh
la source
ls /etc
rechercher et de "blah-release" - quel que soit blah, c'est le système d'exploitation Linux - CentOS, Ubuntu , etcEn bash, utilisez
$OSTYPE
et$HOSTTYPE
, comme documenté; c'est ce que je fais. Si cela ne suffit pas et si evenuname
ouuname -a
(ou d'autres options appropriées) ne donnent pas suffisamment d'informations, il y a toujours le script config.guess du projet GNU, conçu exactement à cet effet.la source
Je suggérerais d'éviter certaines de ces réponses. N'oubliez pas que vous pouvez choisir d'autres formes de comparaison de chaînes, ce qui éliminerait la plupart des variations ou du code laid offert.
Une telle solution serait une simple vérification, telle que:
if [[ "$OSTYPE" =~ ^darwin ]]; then
Ce qui a l'avantage supplémentaire de correspondre à n'importe quelle version de Darwin, malgré son suffixe de version. Cela fonctionne également pour toutes les variations que l'
Linux
on peut attendre.Vous pouvez voir quelques exemples supplémentaires dans mes fichiers dot ici
la source
Essayez d'utiliser "uname". Par exemple, sous Linux: "uname -a".
Selon la page de manuel, uname est conforme à SVr4 et POSIX, donc il devrait être disponible sur Mac OS X et Cygwin aussi, mais je ne peux pas le confirmer.
BTW: $ OSTYPE est également défini
linux-gnu
ici :)la source
J'ai écrit ces sucres dans mon
.bashrc
:Je peux donc faire des trucs comme:
la source
if_nix gnu
&if_os linux
.echo $OSTYPE
. Pour détecter spécifiquement le sous-système win 10 bash, la seule solution que j'ai trouvée était de rechercher «Microsoft» dans/proc/sys/kernel/osrelease
ou
si vous voulez plus d'informations
la source
J'ai écrit une bibliothèque Bash personnelle et un framework de script qui utilise GNU shtool pour effectuer une détection de plateforme plutôt précise.
GNU shtool est un ensemble de scripts très portable qui contient, entre autres choses utiles, la commande 'shtool platform'. Voici la sortie de:
sur quelques machines différentes:
Cela produit des résultats assez satisfaisants, comme vous pouvez le voir. GNU shtool est un peu lent, donc je stocke et mets à jour l'identification de la plateforme dans un fichier sur le système que mes scripts appellent. C'est mon cadre, donc cela fonctionne pour moi, mais votre kilométrage peut varier.
Maintenant, vous devrez trouver un moyen d'empaqueter shtool avec vos scripts, mais ce n'est pas un exercice difficile. Vous pouvez toujours vous rabattre sur la sortie sans nom.
ÉDITER:
J'ai raté le message de Teddy sur
config.guess
(en quelque sorte). Ce sont des scripts très similaires, mais pas les mêmes. Personnellement, j'utilise également shtool pour d'autres utilisations, et cela a très bien fonctionné pour moi.la source
Vous pouvez utiliser les éléments suivants:
alors vous pouvez utiliser la variable OS dans votre script.
la source
uname -s
est différent deuname
?Ci-dessous, vous trouverez une approche pour détecter le système d'exploitation Linux basé sur Debian et RedHat en utilisant la version / etc / lsb et / etc / os-release (selon la version Linux que vous utilisez) et prendre une action simple en fonction de celle-ci.
Exemple de sortie pour Ubuntu Linux:
la source
Cela devrait être sûr à utiliser sur toutes les distributions.
Cela produit quelque chose comme ça.
Extraire / assigner aux variables comme vous le souhaitez
Remarque: sur certaines configurations. Cela peut également vous donner des erreurs que vous pouvez ignorer.
la source
[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
essaye ça:
la source
cat: /etc/*-release: No such file or directory
zsh: no matches found: /etc/*release
- cela ne fonctionnera que pour les systèmes linux, je suppose ...Vous pouvez utiliser la clause if suivante et la développer si nécessaire:
la source
J'ai essayé les messages ci-dessus sur quelques distributions Linux et j'ai trouvé que ce qui suit fonctionnait le mieux pour moi. C'est une réponse exacte et concise qui fonctionne également pour Bash sous Windows.
la source
OS=$( ([[ -f /etc/*release ]] && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || echo "Unknown" )
cela fonctionnera sans lancer d'erreurs.OS=$( $(compgen -G "/etc/*release" > /dev/null) && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || $( echo "${OSTYPE//[0-9.]/}")
J'ai tendance à conserver mes .bashrc et .bash_alias sur un partage de fichiers auquel toutes les plateformes peuvent accéder. Voici comment je vaincre le problème dans mon .bash_alias:
Et j'ai par exemple un .bash_alias_Linux avec:
De cette façon, je garde le code spécifique à la plate-forme et le code portable séparés, vous pouvez faire de même pour .bashrc
la source
Cela vérifie un tas de
known
fichiers pour identifier si la distribution linux est Debian ou Ubunu, puis elle est par défaut la$OSTYPE
variable.la source
Les opérations suivantes ont aidé à effectuer correctement la vérification d'ubuntu:
la source