469 Stimmen

Wie kann man überprüfen, ob das Programm unter Cygwin, Mac oder Linux läuft?

Ich habe ein Shell-Skript, das sowohl unter Windows/Cygwin als auch unter Mac und Linux verwendet wird. Es benötigt leicht unterschiedliche Variablen für jede Version.

Wie kann ein Shell/Bash-Skript erkennen, ob es in Cygwin, auf einem Mac oder unter Linux läuft?

10voto

Steve Jansen Punkte 9178

Um auf Alberts Antwort aufzubauen, verwende ich gerne $COMSPEC zur Erkennung von 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

Dies vermeidet das Parsen von Varianten von Windows-Namen für $OS und Parsing-Varianten von uname wie MINGW, Cygwin, usw.

Hintergrund: %COMSPEC% ist eine Windows-Umgebungsvariable, die den vollständigen Pfad zum Befehlsprozessor (auch bekannt als die Windows-Shell) angibt. Der Wert dieser Variable ist normalerweise %SystemRoot%\system32\cmd.exe die in der Regel wie folgt ausgewertet wird C:\Windows\system32\cmd.exe .

5voto

rubenvb Punkte 71669

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

Alle Informationen, die Sie jemals brauchen werden. Google ist dein Freund.

Utilice uname -s um den Systemnamen abzufragen.

  • Mac: Darwin
  • Cygwin: CYGWIN_...
  • Linux: verschiedene, LINUX für die meisten

4voto

A Fog Punkte 3888

Das Windows-Subsystem für Linux gab es noch nicht, als diese Frage gestellt wurde. In meinem Test hat es diese Ergebnisse geliefert:

uname -s -> Linux
uname -o -> GNU/Linux
uname -r -> 4.4.0-17763-Microsoft

Das bedeutet, dass Sie uname -r benötigen, um es von nativem Linux zu unterscheiden.

2voto

wener Punkte 6332

Ok, das ist mein Weg.

osis()
{
    local n=0
    if [[ "$1" = "-n" ]]; then n=1;shift; fi

    # echo $OS|grep $1 -i >/dev/null
    uname -s |grep -i "$1" >/dev/null

    return $(( $n ^ $? ))
}

z.B..

osis Darwin &&
{
    log_debug Detect mac osx
}
osis Linux &&
{
    log_debug Detect linux
}
osis -n Cygwin &&
{
    log_debug Not Cygwin
}

Ich verwende dies in meinem Punktdateien

1voto

Ich schätze, die uname Antwort ist unschlagbar, vor allem in Bezug auf die Sauberkeit.

Obwohl die Ausführung lächerlich lange dauert, habe ich festgestellt, dass die Prüfung auf das Vorhandensein bestimmter Dateien ebenfalls gute und schnellere Ergebnisse liefert, da ich keine ausführbare Datei aufrufe:

Also,

[ -f /usr/bin/cygwin1.dll ] && echo Yep, Cygwin running

verwendet nur eine schnelle Bash-Dateipräsenzprüfung. Da ich gerade mit Windows arbeite, kann ich Ihnen keine spezifischen Dateien für Linuxe und Mac OS X nennen, aber ich bin mir ziemlich sicher, dass es sie gibt :-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X