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 einfachuname
.
Design
- Verwenden Sie
uname
, um die Systeminformationen abzurufen (Parameter-s
). - Verwenden Sie
expr
undsubstr
, um mit der Zeichenfolge umzugehen. - Verwenden Sie,
if
elif
fi
den passenden Jobelif
. - Sie können weitere
uname -s
hinzufügen, wenn Sie möchten, folgen Sie einfach deruname -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
- Suchen Sie nach öffnenden und schließenden Anführungszeichen.
- 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"
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