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?

42voto

coto Punkte 2207

Ich empfehle, diesen vollständigen Bash-Code zu verwenden

lowercase(){
    echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
}

OS=`lowercase \`uname\``
KERNEL=`uname -r`
MACH=`uname -m`

if [ "{$OS}" == "windowsnt" ]; then
    OS=windows
elif [ "{$OS}" == "darwin" ]; then
    OS=mac
else
    OS=`uname`
    if [ "${OS}" = "SunOS" ] ; then
        OS=Solaris
        ARCH=`uname -p`
        OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
    elif [ "${OS}" = "AIX" ] ; then
        OSSTR="${OS} `oslevel` (`oslevel -r`)"
    elif [ "${OS}" = "Linux" ] ; then
        if [ -f /etc/redhat-release ] ; then
            DistroBasedOn='RedHat'
            DIST=`cat /etc/redhat-release |sed s/\ release.*//`
            PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
            REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
        elif [ -f /etc/SuSE-release ] ; then
            DistroBasedOn='SuSe'
            PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
            REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
        elif [ -f /etc/mandrake-release ] ; then
            DistroBasedOn='Mandrake'
            PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
            REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
        elif [ -f /etc/debian_version ] ; then
            DistroBasedOn='Debian'
            DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F=  '{ print $2 }'`
            PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F=  '{ print $2 }'`
            REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F=  '{ print $2 }'`
        fi
        if [ -f /etc/UnitedLinux-release ] ; then
            DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
        fi
        OS=`lowercase $OS`
        DistroBasedOn=`lowercase $DistroBasedOn`
        readonly OS
        readonly DIST
        readonly DistroBasedOn
        readonly PSUEDONAME
        readonly REV
        readonly KERNEL
        readonly MACH
    fi

fi
echo $OS
echo $KERNEL
echo $MACH

Weitere Beispiele finden Sie hier: https://github.com/coto/server-easy-install/blob/master/lib/core.sh

21voto

Akiva Punkte 311

Ich würde vorschlagen, einige dieser Antworten zu vermeiden. Vergessen Sie nicht, dass Sie andere Formen des String-Vergleichs wählen können, die die meisten der angebotenen Variationen oder hässlichen Codes beseitigen würden.

Eine solche Lösung wäre eine einfache Prüfung, wie z. B.:

if [[ "$OSTYPE" =~ ^darwin ]]; then

Das hat den zusätzlichen Vorteil, dass es mit jeder Version von Darwin übereinstimmt, trotz des Versionssuffixes. Dies funktioniert auch für alle Variationen von Linux kann man erwarten.

Einige weitere Beispiele finden Sie in meinen Dotfiles aquí

14voto

Federico A. Ramponi Punkte 44697
uname

o

uname -a

wenn Sie weitere Informationen wünschen

13voto

Brad Punkte 422

Das verwende ich, falls jemand ebenfalls an der Erkennung von WSL gegenüber WSL Version 2 interessiert ist.

#!/usr/bin/env bash

unameOut=$(uname -a)
case "${unameOut}" in
    *Microsoft*)     OS="WSL";; #must be first since Windows subsystem for linux will have Linux in the name too
    *microsoft*)     OS="WSL2";; #WARNING: My v2 uses ubuntu 20.4 at the moment slightly different name may not always work
    Linux*)     OS="Linux";;
    Darwin*)    OS="Mac";;
    CYGWIN*)    OS="Cygwin";;
    MINGW*)     OS="Windows";;
    *Msys)     OS="Windows";;
    *)          OS="UNKNOWN:${unameOut}"
esac

echo ${OS};

12voto

Joao da Silva Punkte 6993

Versuchen Sie es mit "uname". Zum Beispiel in Linux: "uname -a".

Laut der Handbuchseite ist uname SVr4- und POSIX-konform, so dass es unter Mac OS X und Windows verfügbar sein sollte. Cygwin auch, aber ich kann das nicht bestätigen.

Übrigens: $OSTYPE ist auch auf linux-gnu hier :)

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