796 Stimmen

Wie erkennt man das Betriebssystem aus einem Bash-Skript?

Ich würde gerne meine .bashrc y .bash_login Dateien in der Versionskontrolle, damit ich sie auf allen Computern, die ich benutze, verwenden kann. Das Problem ist, dass ich einige betriebssystemspezifische Aliase habe und deshalb nach einer Möglichkeit gesucht habe, festzustellen, ob das Skript unter Mac OS X, Linux oder Cygwin .

Wie lässt sich das Betriebssystem in einer Bash Drehbuch?

883voto

Timmmm Punkte 76756

Ich denke, das Folgende sollte funktionieren. Ich bin mir nicht sicher über win32 Allerdings.

if [[ "$OSTYPE" == "linux-gnu"* ]]; then
        # ...
elif [[ "$OSTYPE" == "darwin"* ]]; then
        # Mac OSX
elif [[ "$OSTYPE" == "cygwin" ]]; then
        # POSIX compatibility layer and Linux environment emulation for Windows
elif [[ "$OSTYPE" == "msys" ]]; then
        # Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
elif [[ "$OSTYPE" == "win32" ]]; then
        # I'm not sure this can happen.
elif [[ "$OSTYPE" == "freebsd"* ]]; then
        # ...
else
        # Unknown.
fi

317voto

Für meine .bashrc verwende ich den folgenden Code:

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

Dann mache ich so etwas wie:

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

Es ist hässlich, aber es funktioniert. Sie können verwenden case anstelle von if wenn Sie es vorziehen.

304voto

El Bash-Manpage besagt, dass die Variable OSTYPE den Namen des Betriebssystems speichert:

OSTYPE Automatisch auf eine Zeichenkette gesetzt, die das Betriebssystem beschreibt, auf dem die Bash ausgeführt wird. Die Vorgabe ist system abhängig.

Sie ist eingestellt auf linux-gnu hier.

94 Stimmen

case $OSTYPE in darwin*) echo I am a Mac ;; esac

265voto

kenorb Punkte 134883

$OSTYPE

Sie können einfach die vordefinierten $OSTYPE variabel z.B.:

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

Es ist jedoch von den älteren Shells nicht erkannt (wie zum Beispiel Bourne-Shell ).


uname

Eine andere Methode besteht darin, die Plattform anhand der uname Befehl.

Siehe das folgende Skript (bereit zum Einfügen in .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

Einige praktische Beispiele finden Sie in meinem .bashrc .


Hier ist eine ähnliche Version, die auf Travis CI :

case $(uname | tr '[:upper:]' '[:lower:]') in
  linux*)
    export TRAVIS_OS_NAME=linux
    ;;
  darwin*)
    export TRAVIS_OS_NAME=osx
    ;;
  msys*)
    export TRAVIS_OS_NAME=windows
    ;;
  *)
    export TRAVIS_OS_NAME=notset
    ;;
esac

48voto

Norman Ramsey Punkte 193087

Aufspüren von Betriebssystem und CPU-Typ ist nicht so einfach zu bewerkstelligen tragbar . Ich habe eine sh Skript von etwa 100 Zeilen, das auf einer Vielzahl von Unix-Plattformen funktioniert: auf jedem System, das ich seit 1988 benutzt habe.

Die wichtigsten Elemente sind

  • uname -p es Prozessortyp ist aber in der Regel unknown auf modernen Unix-Plattformen.

  • uname -m gibt auf einigen Unix-Systemen den "Hardware-Namen der Maschine" an.

  • /bin/arch gibt, falls vorhanden, in der Regel den Typ des Prozessors an.

  • uname ohne Argumente wird das Betriebssystem benannt.

Schließlich müssen Sie sich über die Unterschiede zwischen Plattformen und wie fein Sie sie machen wollen. Um die Dinge einfach zu halten, behandle ich zum Beispiel i386 über i686 jede " Pentium* " und jede " AMD*Athlon* " alle als x86 .

Meine ~/.profile führt beim Start ein Skript aus, das eine Variable auf eine Zeichenfolge setzt, die die Kombination aus CPU und Betriebssystem angibt. Ich habe plattformspezifische bin , man , lib y include Verzeichnisse, die auf dieser Grundlage eingerichtet werden. Dann setze ich eine ganze Reihe von Umgebungsvariablen. So kann z.B. ein Shell-Skript zum Neuformatieren von Mails z.B. aufrufen, $LIB/mailfmt die eine plattformspezifische ausführbare Binärdatei ist.

Wenn Sie an der falschen Stelle sparen wollen , uname -m und einfach uname wird Ihnen auf vielen Plattformen sagen, was Sie wissen wollen. Fügen Sie weitere Informationen hinzu, wenn Sie sie brauchen. (Und verwenden Sie case , nicht verschachtelt if !)

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