bash - portable - cygwin terminal




Wie überprüft man, ob es in Cygwin, Mac oder Linux läuft? (7)

Ich habe ein Shell-Skript, das sowohl auf Windows / Cygwin als auch auf 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 in Linux läuft?


Hier ist das Bash-Skript, das ich verwendet habe, um drei verschiedene Betriebssysteme zu erkennen (GNU / Linux, Mac OS X, Windows NT)

Passt auf

  • Verwenden Sie in Ihrem Bash-Skript #!/usr/bin/env bash anstelle von #!/bin/sh , um das Problem zu vermeiden, das von /bin/sh mit verschiedenen Standard-Shells auf verschiedenen Plattformen verursacht wird, oder dass ein unerwarteter Operator auftritt , das ist auf meinem Computer passiert (Ubuntu 64 bit 12.04).
  • Mac OS X 10.6.8 (Snow Leopard) hat kein expr Programm, es sei denn, Sie installieren es, also verwende ich einfach uname .

Design

  1. Verwenden Sie uname , um die Systeminformationen abzurufen (Parameter -s ).
  2. Verwenden Sie expr und substr , um mit der Zeichenfolge umzugehen.
  3. Verwenden Sie, if elif fi den passenden Job elif .
  4. Sie können weitere uname -s hinzufügen, wenn Sie möchten, folgen Sie einfach der uname -s Spezifikation.

Implementierung

#!/usr/bin/env bash

if [ "$(uname)" == "Darwin" ]; then
    # Do something under Mac OS X platform        
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
    # Do something under GNU/Linux platform
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]; then
    # Do something under 32 bits Windows NT platform
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then
    # Do something under 64 bits Windows NT platform
fi

Testen

  • Linux (Ubuntu 12.04 LTS, Kernel 3.2.0) hat OK getestet.
  • OS X (10.6.8 Snow Leopard) hat OK getestet.
  • Windows (Windows 7 64 Bit) getestet, OK.

Was ich gelernt habe

  1. Suchen Sie nach öffnenden und schließenden Anführungszeichen.
  2. Suchen nach fehlenden Klammern und geschweiften Klammern {}

Verweise


Bash setzt die Shellvariable OSTYPE. Von man bash :

Wird automatisch auf eine Zeichenfolge gesetzt, die das Betriebssystem beschreibt, auf dem Bash ausgeführt wird.

Dies hat einen kleinen Vorteil gegenüber uname , da kein neuer Prozess gestartet werden muss und somit schneller ausgeführt werden kann.

Ich kann jedoch keine verbindliche Liste der erwarteten Werte finden. Bei Ubuntu 14.04 ist es auf 'linux-gnu' eingestellt. Ich habe das Internet nach anderen Werten abgesucht. Daher:

case "$OSTYPE" in
  linux*)   echo "Linux / WSL" ;;
  darwin*)  echo "Mac OS" ;; 
  win*)     echo "Windows" ;;
  msys*)    echo "MSYS / MinGW / Git Bash" ;;
  cygwin*)  echo "Cygwin" ;;
  bsd*)     echo "BSD" ;;
  solaris*) echo "Solaris" ;;
  *)        echo "unknown: $OSTYPE" ;;
esac

Die Sternchen sind in einigen Fällen wichtig - zum Beispiel hängt OSX eine Betriebssystem-Versionsnummer nach dem "Darwin" an. Der 'Gewinn'-Wert ist tatsächlich' win32 ', wurde mir gesagt - vielleicht gibt es einen' win64 '?

Vielleicht könnten wir zusammenarbeiten, um eine Tabelle mit überprüften Werten zu füllen:

  • Linux Ubuntu (inkl. WSL ): linux-gnu
  • Cygwin 64-Bit: cygwin
  • Msys / MINGW (Git Bash für Windows): msys

(Bitte fügen Sie Ihren Wert hinzu, wenn dieser von bestehenden Einträgen abweicht)


Ok, hier 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 benutze das in meinen dotfiles


Um auf Albert's Antwort aufzubauen, verwende ich $COMSPEC um Windows zu erkennen:

#!/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 das Parsen von Varianten von uname wie MINGW, Cygwin usw.

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


Verwenden Sie nur diese von der Befehlszeile funktioniert sehr gut, dank Justin:

#!/bin/bash

################################################## #########
# Bash script to find which OS
################################################## #########

OS=`uname`
echo "$OS"

source


en.wikipedia.org/wiki/Uname

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

Verwenden Sie uname -s , um den Systemnamen abzufragen.

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

# This script fragment emits Cygwin rulez under bash/cygwin
if [ "$(expr substr $(uname -s) 1 6)" == "CYGWIN" ];then
    echo Cygwin rulez
else 
    echo Unix is king
fi

Wenn die ersten sechs Zeichen des Befehls uname -s "CYGWIN" sind, wird ein Cygwin-System angenommen





cygwin