In der Regel uname
erfahren Sie anhand der verschiedenen Optionen, in welcher Umgebung Sie ausgeführt werden:
pax> uname -a
CYGWIN_NT-5.1 IBM-L3F3936 1.5.25(0.156/4/2) 2008-06-12 19:34 i686 Cygwin
pax> uname -s
CYGWIN_NT-5.1
Und laut dem sehr hilfreichen schot
(in den Kommentaren) uname -s
gibt es Darwin
für OSX und Linux
für Linux, während mein Cygwin gibt CYGWIN_NT-5.1
. Möglicherweise müssen Sie jedoch mit allen möglichen Versionen experimentieren.
Der bash
Code für eine solche Überprüfung lautet also wie folgt:
unameOut="$(uname -s)"
case "${unameOut}" in
Linux*) machine=Linux;;
Darwin*) machine=Mac;;
CYGWIN*) machine=Cygwin;;
MINGW*) machine=MinGw;;
*) machine="UNKNOWN:${unameOut}"
esac
echo ${machine}
Beachten Sie, dass ich hier davon ausgehe, dass Sie tatsächlich in CygWin (der bash
Shell davon) ausgeführt werden, sodass Pfade bereits korrekt eingerichtet sein sollten. Wie ein Kommentator feststellt, können Sie das bash
Programm unter Übergabe des Skripts von cmd
sich aus ausführen. Dies kann dazu führen, dass die Pfade nicht nach Bedarf eingerichtet werden.
Wenn Sie sind , das zu tun, ist es in Ihrer Verantwortung , die richtigen ausführbaren Dateien (dh die CygWin sind) werden genannt, die möglicherweise durch Ändern der Pfad vorher oder vollständig unter Angabe der ausführbaren Orten (zB zu gewährleisten /c/cygwin/bin/uname
).
MINGW32_NT-6.1
. Es gibt auch kein/cygdrive
Präfix, nur/c
fürC:
.How can a shell/bash script detect ...
und die andere.uname -s
ruft schließlich das auf, wasuname
zuerst in Ihrem aktuellen Pfad steht. Auf meinem System stellt sich heraus, dass es sich um die installierte Version handelt, mitgeda
der der Text zurückgegeben wirdWindowsNT
. Es könnte jedoch auch die oben beschriebene MinGW-Version sein. Eine zuverlässige Erkennung für Cygwin darf nicht davon abhängen, dass der Pfad entsprechend eingestellt ist, IMO. Daher$(uname -s)
sollte geändert werden$(/bin/uname -s)
, um Cygwin zu erkennen.Hier ist das Bash-Skript, mit dem ich drei verschiedene Betriebssystemtypen erkannt habe (GNU / Linux, Mac OS X, Windows NT).
Passt auf
#!/usr/bin/env bash
stattdessen#!/bin/sh
, um das Problem zu verhindern, das durch die/bin/sh
Verknüpfung mit einer anderen Standard-Shell auf verschiedenen Plattformen verursacht wird, oder es tritt ein Fehler wie ein unerwarteter Operator auf. Dies ist auf meinem Computer passiert (Ubuntu 64 Bit 12.04).expr
Programm, es sei denn, Sie installieren es, also benutze ich es einfachuname
.Design
uname
diese Option , um die Systeminformationen (-s
Parameter) abzurufen.expr
undsubstr
, um mit der Zeichenfolge umzugehen.if
elif
fi
diese Option , um den passenden Job auszuführen.uname -s
Spezifikation.Implementierung
Testen
Was ich gelernt habe
Verweise
quelle
[ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]
."$(expr substr $(uname -s) 1 5)"
ist ein bisschen komisch. Es gibt hübschere Möglichkeiten, dies zu tun, zum Beispiel :if [ `uname -s` == CYGWIN* ]; then
. Lesen Sie es: Wennuname -s
mit CYGWIN beginnt, dann ...if [[ $(uname -s) == CYGWIN* ]]; then
uname -s
, die etwas anderes als "Linux" liefern?Verwenden Sie
uname -s
(--kernel-name
), dauname -o
(--operating-system
) auf einigen Betriebssystemen wie Mac OS und Solaris nicht unterstützt wird . Sie können auch nuruname
ohne Argument verwenden, da das Standardargument-s
(--kernel-name
) ist.Das folgende Snippet ist nicht erforderlich Bash(dh nicht erforderlich
#!/bin/bash
)Das Folgende
Makefile
ist vom Git-Projekt (config.mak.uname
) inspiriert .Siehe auch diese vollständige Antwort zu
uname -s
undMakefile
.Die Korrespondenztabelle am Ende dieser Antwort stammt aus einem Wikipedia-Artikel über
uname
. Bitte tragen Sie dazu bei, es auf dem neuesten Stand zu halten (bearbeiten Sie die Antwort oder schreiben Sie einen Kommentar). Sie können auch den Wikipedia-Artikel aktualisieren und einen Kommentar veröffentlichen, um mich über Ihren Beitrag zu informieren ;-)Operating System
uname -s
Mac OS X
Darwin
Cygwin 32-bit (Win-XP)
CYGWIN_NT-5.1
Cygwin 32-bit (Win-7 32-bit)
CYGWIN_NT-6.1
Cygwin 32-bit (Win-7 64-bit)
CYGWIN_NT-6.1-WOW64
Cygwin 64-bit (Win-7 64-bit)
CYGWIN_NT-6.1
MinGW (Windows 7 32-bit)
MINGW32_NT-6.1
MinGW (Windows 10 64-bit)
MINGW64_NT-10.0
Interix (Services for UNIX)
Interix
MSYS
MSYS_NT-6.1
MSYS2
MSYS_NT-10.0-17763
Windows Subsystem for Linux
Linux
Android
Linux
coreutils
Linux
CentOS
Linux
Fedora
Linux
Gentoo
Linux
Red Hat Linux
Linux
Linux Mint
Linux
openSUSE
Linux
Ubuntu
Linux
Unity Linux
Linux
Manjaro Linux
Linux
OpenWRT r40420
Linux
Debian (Linux)
Linux
Debian (GNU Hurd)
GNU
Debian (kFreeBSD)
GNU/kFreeBSD
FreeBSD
FreeBSD
NetBSD
NetBSD
DragonFlyBSD
DragonFly
Haiku
Haiku
NonStop
NONSTOP_KERNEL
QNX
QNX
ReliantUNIX
ReliantUNIX-Y
SINIX
SINIX-Y
Tru64
OSF1
Ultrix
ULTRIX
IRIX 32 bits
IRIX
IRIX 64 bits
IRIX64
MINIX
Minix
Solaris
SunOS
UWIN (64-bit Windows 7)
UWIN-W7
SYS$UNIX:SH on OpenVMS
IS/WB
z/OS USS
OS/390
Cray
sn5176
(SCO) OpenServer
SCO_SV
(SCO) System V
SCO_SV
(SCO) UnixWare
UnixWare
IBM AIX
AIX
IBM i with QSH
OS400
HP-UX
HP-UX
quelle
~/.profile
(um Umgebungsvariablen wie$PATH
- Kommentieren, um Suchschlüsselwörter für die Nachwelt bereitzustellen) zu schreiben .uname -sr
und zu vergleichen .Linux*Microsoft)
Linux*)
Bash setzt die Shell-Variable OSTYPE. Von
man bash
:Dies hat einen winzigen Vorteil gegenüber dem,
uname
dass kein neuer Prozess gestartet werden muss und daher schneller ausgeführt werden kann.Ich kann jedoch keine maßgebliche Liste der erwarteten Werte finden. Für mich unter Ubuntu 14.04 ist es auf 'linux-gnu' eingestellt. Ich habe das Web nach anderen Werten durchsucht. Daher:
Die Sternchen sind in einigen Fällen wichtig - zum Beispiel fügt OSX nach dem 'darwin' eine Versionsnummer des Betriebssystems hinzu. Der 'Win'-Wert ist tatsächlich' Win32 ', wurde mir gesagt - vielleicht gibt es einen' Win64 '?
Vielleicht könnten wir hier zusammenarbeiten, um eine Tabelle mit verifizierten Werten zu füllen:
linux-gnu
cygwin
msys
(Bitte fügen Sie Ihren Wert hinzu, wenn er von vorhandenen Einträgen abweicht.)
quelle
env | grep OSTYPE
, aber Sie werden es unter sehenset | grep OSTYPE
OSTYPE
Variable von Bash (conftypes.h) zur Erstellungszeit unter Verwendung der exakten Kopie derOS
Variablen von automake (Makefile.in) konfiguriert . Sie können die lib / config.sub- Datei von automake für alle verfügbaren Typen konsultieren .Um auf Alberts Antwort aufzubauen, verwende ich gerne
$COMSPEC
Windows:Dies vermeidet das Parsen von Varianten von Windows-Namen für
$OS
und das Parsen von Varianten vonuname
MINGW, Cygwin usw.Hintergrund:
%COMSPEC%
ist eine Windows-Umgebungsvariable, die den vollständigen Pfad zum Befehlsprozessor (auch bekannt als Windows-Shell) angibt. Der Wert dieser Variablen ist in%SystemRoot%\system32\cmd.exe
der Regel der Wert , der normalerweise ausgewertet wirdC:\Windows\system32\cmd.exe
.quelle
Wenn die 6 ersten Zeichen des Befehls uname -s "CYGWIN" sind, wird ein Cygwin-System angenommen
quelle
if [ `uname -s` == CYGWIN* ]; then
sieht besser aus und funktioniert genauso.[[ $(uname -s) == CYGWIN* ]]
. Beachten Sie auch, dass erweiterte reguläre Ausdrücke in unserem Fall genauer sind :[[ $(uname -s) =~ ^CYGWIN* ]]
.expr substr $(uname -s) 1 6
ein error (expr: syntax error
) angezeigt wird.Ok, hier ist mein Weg.
z.B
Ich benutze dies in meinen Dotfiles
quelle
http://en.wikipedia.org/wiki/Uname
Alle Informationen, die Sie jemals brauchen werden. Google ist dein Freund.
Verwenden Sie
uname -s
diese Option, um den Systemnamen abzufragen.Darwin
CYGWIN_...
LINUX
für die meisten verschiedenquelle
Das Windows-Subsystem für Linux war nicht vorhanden, als diese Frage gestellt wurde. Es gab diese Ergebnisse in meinem Test:
Dies bedeutet, dass Sie uname -r benötigen, um es von nativem Linux zu unterscheiden.
quelle
Ich denke, die uname Antwort ist unschlagbar, hauptsächlich in Bezug auf Sauberkeit.
Obwohl die Ausführung eine lächerliche Zeit in Anspruch nimmt, habe ich festgestellt, dass das Testen auf das Vorhandensein bestimmter Dateien auch gute und schnellere Ergebnisse liefert, da ich keine ausführbare Datei aufrufe:
Damit,
[ -f /usr/bin/cygwin1.dll ] && echo Yep, Cygwin running
verwendet nur eine schnelle Überprüfung der Anwesenheit von Bash-Dateien. Da ich gerade unter Windows bin, kann ich Ihnen keine spezifischen Dateien für Linux und Mac OS X aus meinem Kopf sagen, aber ich bin mir ziemlich sicher, dass sie existieren. :-)
quelle
Verwenden Sie nur diese von der Kommandozeile funktioniert sehr gut, dank Justin:
Quelle
quelle