Ich möchte meine .bashrc
und .bash_login
Dateien in der Versionskontrolle behalten, damit ich sie zwischen allen von mir verwendeten Computern verwenden kann. Das Problem ist, dass ich einige betriebssystemspezifische Aliase habe und daher nach einer Möglichkeit gesucht habe, festzustellen, ob das Skript unter Mac OS X, Linux oder Cygwin ausgeführt wird .
Was ist der richtige Weg, um das Betriebssystem in einem Bash- Skript zu erkennen?
bash
os-detection
csexton
quelle
quelle
Antworten:
Ich denke, das Folgende sollte funktionieren. Ich bin mir
win32
allerdings nicht sicher .quelle
msys
für Git Bash / msysGit undcygwin
für Cygwinmsys
;
.source somefile ;
, bekomme ichsyntax error near unexpected token elif
.Für meine .bashrc verwende ich den folgenden Code:
Dann mache ich etwas wie:
Es ist hässlich, aber es funktioniert. Sie können
case
anstelle von verwenden,if
wenn Sie es vorziehen.quelle
platform="$(uname | tr '[:upper:]' '[:lower:]')"
und dann definitiv in einem Fall zu behandeln? Es scheint nur seltsam, eine Abhängigkeit von einer ganz bestimmten Ausgabe fest zu codieren.Die Bash-Manpage besagt, dass die Variable OSTYPE den Namen des Betriebssystems speichert:
Es ist
linux-gnu
hier eingestellt.quelle
os=${OSTYPE//[0-9.]/}
case $OSTYPE in darwin*) echo I am a Mac ;; esac
if [[ $OSTYPE == darwin* ]]; then echo I am a Mac;fi
$OSTYPE
Sie können einfach eine vordefinierte
$OSTYPE
Variable verwenden, z.Es wird jedoch von den älteren Muscheln (wie der Bourne-Muschel ) nicht erkannt .
uname
Eine andere Methode besteht darin, eine Plattform basierend auf zu erkennen
uname
Befehl .Siehe das folgende Skript (bereit, in .bashrc aufgenommen zu werden):
Ein praktisches Beispiel finden Sie in meinem
.bashrc
.Hier ist eine ähnliche Version, die auf Travis CI verwendet wird :
quelle
uname
, Oracle hat Konventionen beschönigt und eine kostenlose Versionszeichenfolge mit ihren eingefügtOSTYPE ==> solaris2.11
.uname
ist etwas sauberer und weniger Arbeit zu erledigen.Das Erkennen von Betriebssystem und CPU-Typ ist nicht so einfach portabel . Ich habe ein
sh
Skript mit ungefähr 100 Zeilen, das auf einer Vielzahl von Unix-Plattformen funktioniert: jedes System, das ich seit 1988 verwende.Die Schlüsselelemente sind
uname -p
ist ein Prozessortyp , befindet sich jedoch normalerweiseunknown
auf modernen Unix-Plattformen.uname -m
gibt auf einigen Unix-Systemen den "Namen der Maschinenhardware" an./bin/arch
, falls vorhanden, gibt normalerweise den Prozessortyp an.uname
Ohne Argumente wird das Betriebssystem benannt.Schließlich müssen Sie über die Unterschiede zwischen Plattformen nachdenken und darüber, wie gut Sie sie machen möchten. Zum Beispiel, nur die Dinge einfach zu halten, behandeln ich
i386
durchi686
jede „Pentium*
“ und alle „AMD*Athlon*
“ alle alsx86
.My
~/.profile
führt beim Start ein Skript aus, das eine Variable auf eine Zeichenfolge setzt, die die Kombination von CPU und Betriebssystem angibt. Ich habe plattformspezifischebin
,man
,lib
, undinclude
Verzeichnisse , die auf das gesetzt bekommen basiert. Dann habe ich eine Schiffsladung Umgebungsvariablen gesetzt. So kann beispielsweise ein Shell-Skript zum Neuformatieren von E-Mails z.$LIB/mailfmt
eine plattformspezifische ausführbare Binärdatei.Wenn Sie schneiden Ecken wollen ,
uname -m
und Ebeneuname
wird Ihnen sagen , was Sie auf vielen Plattformen wissen wollen. Fügen Sie andere Dinge hinzu, wenn Sie es brauchen. (Und verwendencase
, nicht verschachteltif
!)quelle
uname -s
?Ich empfehle, diesen vollständigen Bash-Code zu verwenden
Weitere Beispiele hier: https://github.com/coto/server-easy-install/blob/master/lib/core.sh
quelle
ls /etc
nach "blah-release" zu suchen - was auch immer blah ist, das ist das Linux-Betriebssystem - CentOS, Ubuntu , etcVerwenden Sie in bash
$OSTYPE
und$HOSTTYPE
, wie dokumentiert; das ist was ich mache. Wenn dies nicht ausreicht und geradeuname
oderuname -a
(oder andere geeignete Optionen) nicht genügend Informationen liefern, gibt es immer das Skript config.guess aus dem GNU-Projekt, das genau für diesen Zweck erstellt wurde.quelle
Ich würde vorschlagen, einige dieser Antworten zu vermeiden. Vergessen Sie nicht, dass Sie andere Formen des Zeichenfolgenvergleichs auswählen können, um die meisten Variationen oder den angebotenen hässlichen Code zu beseitigen.
Eine solche Lösung wäre eine einfache Überprüfung, wie zum Beispiel:
if [[ "$OSTYPE" =~ ^darwin ]]; then
Dies hat den zusätzlichen Vorteil, dass jede Version von Darwin trotz des Versionssuffixes übereinstimmt. Dies funktioniert auch für alle Variationen von
Linux
man erwarten kann.Sie können einige zusätzliche Beispiele in meinen Punktedateien hier sehen
quelle
Versuchen Sie es mit "uname". Zum Beispiel unter Linux: "uname -a".
Laut der Handbuchseite entspricht uname SVr4 und POSIX, daher sollte es unter Mac OS X und Cygwin verfügbar sein , aber das kann ich nicht bestätigen.
Übrigens: $ OSTYPE ist auch
linux-gnu
hier eingestellt :)quelle
Ich schrieb diese Zucker in meine
.bashrc
:So kann ich Sachen machen wie:
quelle
if_nix gnu
& true zurückgegeben werden sollteif_os linux
.echo $OSTYPE
. Um das Win 10 Bash-Subsystem spezifisch zu erkennen, war die einzige Lösung, die ich gefunden habe, nach "Microsoft" in/proc/sys/kernel/osrelease
oder
Wenn Sie weitere Informationen wünschen
quelle
Ich habe eine persönliche Bash-Bibliothek und ein Scripting-Framework geschrieben , das GNU shtool verwendet , um eine ziemlich genaue Plattformerkennung .
GNU shtool ist ein sehr portabler Satz von Skripten, der unter anderem den Befehl 'shtool platform' enthält. Hier ist die Ausgabe von:
auf einigen verschiedenen Maschinen:
Dies führt zu ziemlich zufriedenstellenden Ergebnissen, wie Sie sehen können. GNU shtool ist etwas langsam, daher speichere und aktualisiere ich die Plattformidentifikation tatsächlich in einer Datei auf dem System, das meine Skripte aufrufen. Es ist mein Rahmen, so dass es für mich funktioniert, aber Ihr Kilometerstand kann variieren.
Jetzt müssen Sie einen Weg finden, shtool mit Ihren Skripten zu verpacken, aber es ist keine schwierige Übung. Sie können auch jederzeit auf die Ausgabe ohne Namen zurückgreifen.
BEARBEITEN:
Ich habe den Beitrag von Teddy über
config.guess
(irgendwie) verpasst . Dies sind sehr ähnliche Skripte, aber nicht die gleichen. Ich persönlich benutze shtool auch für andere Zwecke und es hat für mich ganz gut funktioniert.quelle
Sie können Folgendes verwenden:
Dann können Sie die Betriebssystemvariable in Ihrem Skript verwenden.
quelle
uname -s
es anders ist alsuname
?Im Folgenden finden Sie einen Ansatz zum Erkennen von Debian- und RedHat-basierten Linux-Betriebssystemen unter Verwendung von / etc / lsb-release und / etc / os-release (abhängig von der verwendeten Linux -Version ) und zum Ausführen einer einfachen darauf basierenden Aktion.
Ausgabebeispiel für Ubuntu Linux:
quelle
Dies sollte in allen Distributionen sicher sein.
Dies erzeugt so etwas.
Extrahieren / Zuweisen von Variablen nach Ihren Wünschen
Hinweis: Bei einigen Setups. Dies kann auch zu Fehlern führen, die Sie ignorieren können.
quelle
[user@host ~]$ cat /etc/*release CentOS release 6.4 (Final) CentOS release 6.4 (Final) CentOS release 6.4 (Final)
cat: /etc/*release: No such file or directory
Versuche dies:
quelle
cat: /etc/*-release: No such file or directory
zsh: no matches found: /etc/*release
- das wird nur für Linux-Systeme funktionieren, nehme ich an ...Sie können die folgende if-Klausel verwenden und nach Bedarf erweitern:
quelle
Ich habe die oben genannten Meldungen in einigen Linux-Distributionen ausprobiert und festgestellt, dass Folgendes für mich am besten funktioniert. Es ist eine kurze, präzise Wortantwort, die auch für Bash unter Windows funktioniert.
quelle
OS=$( ([[ -f /etc/*release ]] && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || echo "Unknown" )
dies funktioniert ohne Fehler zu werfen.OS=$( $(compgen -G "/etc/*release" > /dev/null) && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || $( echo "${OSTYPE//[0-9.]/}")
Ich neige dazu, meine .bashrc- und .bash_alias-Dateien auf einer Dateifreigabe zu belassen, auf die alle Plattformen zugreifen können. So überwinde ich das Problem in meinen .bash_alias:
Und ich habe zum Beispiel eine .bash_alias_Linux mit:
Auf diese Weise halte ich plattformspezifischen und portablen Code getrennt. Sie können dasselbe für .bashrc tun
quelle
Dies überprüft eine Reihe von
known
Dateien auf Identifikation, wenn die Linux-Distribution Debian oder Ubunu ist, dann wird standardmäßig die$OSTYPE
Variable verwendet.quelle
Wenn Sie Folgendes tun, können Sie die Prüfung für Ubuntu korrekt durchführen:
quelle