2016-06-28 22 views
11

Ziemlich geradlinig, die üblichen Orte, um herauszufinden, das Betriebssystem, auf dem Sie sich befinden, scheinen mit Ubuntu auf Ubuntu für Windows identisch zu sein. Zum Beispiel ist uname -a identisch mit einer nativen GNU/Linux-Installation und /etc/os-version ist identisch mit einer Ubuntu Trusty Tahr-Installation.Wie kann man überprüfen, ob ein Programm in Bash unter Ubuntu unter Windows und nicht nur in Ubuntu ausgeführt wird?

Das einzige, was ich denken kann, ist zu überprüfen, ob /mnt/c/Windows existiert, aber ich bin mir nicht sicher, ob das eine idiotensichere Idee ist.

Antwort

5

Ich habe nach Wegen gesucht, das auch zu erkennen. Bisher habe ich gefunden 2.

  • /proc/sys/kernel/osrelease ist "3.4.0-Microsoft"

  • /proc/version ist „Linux Version 3.4.0-Microsoft ([email protected]) (gcc-Version 4.7 (GCC)) # 1 SMP PREEMPT Mi 31. Dezember 14.42.53 PST 2014"

Wenn Sie nur die Verteilung standardmäßig installiert Ubuntu verwenden sollte es keine Probleme mit ihnen mit, wie they said that it would be unlikely for them to set either to something that doesn't contain "Microsoft" or "WSL".

Wenn Sie jedoch eine andere Linux-Distribution installieren, bin ich ziemlich sicher, dass sich der Inhalt von /proc/sys/kernel/osrelease und /proc/version ändern wird, da die Distribution nicht von Microsoft kompiliert worden wäre.

+0

Da die procfs des von Windows emuliert wird, sollte es (im Prinzip, wie auf dem Github Kommentar angegeben) enthält immer diese Zeichenfolge Microsoft, unabhängig von der Verteilung verwendet, so dass der letzte Absatz mir scheint verwirrt. –

+1

@GuillemJover, das hängt davon ab, ob die hypothetische andere Distribution WSL verwendet oder nicht, denke ich. Ich weiß nicht, ob Cygwin diese Funktionalität emuliert, aber wenn es so ist, kann ich mir nicht vorstellen, dass Microsoft das sagen würde. (Obwohl ich denke, die Phrase "Microsoft Windows" könnte in der Zeichenfolge angezeigt werden. Ich wette "[email protected]" wird nicht!) –

+0

@HarryJohnston Unter/Cygwin enthält '/ proc/version' eine Zeichenfolge beginnend mit" CYGWIN_NT " und "/ proc/sys/kernel/osrelease" existiert überhaupt nicht. – duskwuff

10

Die folgenden Arbeiten in der Bash auf 10 Windows, MacOS und Linux:

#!/bin/bash 
set -e 
if grep -qE "(Microsoft|WSL)" /proc/version &> /dev/null ; then 
    echo "Windows 10 Bash" 
else 
    echo "Anything else" 
fi 

Sie müssen beide "Microsoft" und "WSL" pro this comment von Ben Hillis, WSL Entwickler prüfen:

Für den Moment ist dies wahrscheinlich der beste Weg, es zu tun. Ich kann nicht versprechen, dass wir den Inhalt dieser ProcFs Dateien nie ändern werden, aber Ich denke, es ist unwahrscheinlich, dass wir es zu etwas ändern, das nicht enthält "Microsoft" oder "WSL".

/proc/sys/kernel/osrelease 
/proc/version 
1

Ich kam gerade für das Hinzufügen einiger WSL Artikel zu $ ​​PATH mit diesem für meinen .bashrc auf.

Funktioniert in 1703. Nicht sicher, ob frühere Versionen.

if [[ $(uname -r) =~ Microsoft$ ]]; then 
    foo 
fi