2016-08-05 2 views
7

Ich mache ein Bash-Skript. Mein Custom bashrc, um genau zu sein. Und ich muss separate Konfigurationen haben, abhängig davon, "Linux" ich bin (das Windows 10 Linux-Subsystem oder tatsächliche Linux).Wie man Linux von Windows 10 Bash während der Herstellung von Bash-Skripten zu unterscheiden

Wie kann ich sie unterscheiden?

Dinge, die ich versucht:

  1. $OSTYPE - beide linux-gnu
  2. uname -a zurückkehren - beide ähnliche Rückkehr Linux COMPUTER_NAME_HERE 3.4.0+ #1 PREEMPT Thu Aug 1 17:06:05 CST 2013 x86_64 x86_64 x86_64 GNU/Linux
  3. lsb_release -a - beide Rück ubuntu xx.xx
  4. cat /etc/issue.net - beide Ubuntu 14.04.4 LTS
  5. ld -v zurückkehren - beide Rückkehr GNU ld (GNU Binutils for Ubuntu) 2.24

Der einzige Weg, die ich gefunden habe, diese Arbeit zu machen, ist ein spezifischen Benutzername für das Windows-Subsystem zu setzen, und verwenden Sie $USER, aber das ist keine Option, ich bin zu verwenden, bereit. Ich brauche das, um aus der Box zu arbeiten, ohne benutzerdefinierte Benutzernamen, Umgebungsvariablen usw.

+0

Hmm überprüfen, was ist das Linux-Subsystem für Windows 10? Wie installiert man es? Wie auch immer, ich denke, jede Windows-Bash erkennt Pfade im Windows-Stil, in denen Laufwerksbuchstaben enthalten sind. Überprüfen Sie also, ob 'c: /' existiert und './c: /' nicht. –

+0

@ n.m. Es ist etwas, wie Linux-System unter Windows .. Nicht wie Landstreicher oder andere (wo Sie Linux als virtuelles System starten), sondern Linux-Befehle, übersetzt in Windows (auf Kernel-Ebene). Mehr kann ich nicht erklären, da ich gerade selbst davon lerne. Einfach "Ubuntu for Windows" googlen und finden. Ich muss sagen, ich bin ziemlich aufgeregt über diese, wie ich Windows liebe, aber es ist schwer, es als Entwicklung OS zu verwenden. (Speziell für RubyOnRails) – PragmaticEd

+0

Ah so ist es wie Wein in die andere Richtung. Ordentlich! –

Antwort

5

Siehe /proc/sys/kernel/osrelease

Sie für Windows mit grep -qi Microsoft /proc/sys/kernel/osrelease 2> /dev/null

+0

Ich bin nicht positiv, das ist technisch korrekt, da ich Windows Bash nicht habe, aber das wäre eine viel bessere Lösung als die akzeptierte, wenn es korrekt ist weil du etwas überprüfst, das nicht mehrdeutig wäre. Es gibt wahrscheinlich auch eine vergleichbare/sys Datei/Inhalt, obwohl altes Linux möglicherweise nicht/sys hat oder unvollständig ist, aber für die positive Übereinstimmung wäre das egal. Ich bevorzuge es, direkt in/sys zu gehen, anstatt das/proc zu verwenden, wenn es möglich ist. – Lizardx

+0

Dies ist viel besser, da windows bash '3.4.0-Microsoft' zurückgibt – PragmaticEd

4

Okey, fand ich eine Antwort. Ich kann Verzeichnis Check /mtn/c/Users, verwenden, die nur in Windows Linux-Subsystem sein wird, etwa so:

if [ -d "/mnt/c/Users" ]; then 
    echo "this is windows 10 bash" 
fi 

Also, mein Ende Code sieht wie folgt aus, falls jemand brauchen diese:

# get "OS type" 
# * linux 
# * linux_vagrant 
# * windows_bash 
# * windows_git 
# ------------------------------------------- 
if [ $OSTYPE=="msys" ]; then 
    MY_BASH_OS="windows_git" 
elif [[ $OSTYPE=="linux-gnu" || -d "/mnt/c/Users" ]]; then 
    MY_BASH_OS="windows_bash" 
elif [[ $OSTYPE=="linux-gnu" || $USER=="vagrant" ]]; then 
    MY_BASH_OS="linux_vagrant" 
elif [ $OSTYPE=="linux-gnu" ]; then 
    MY_BASH_OS="linux" 
else 
    echo "NO OS DETECTED. Exiting my_bash" 
    return 
fi 

UPDATE: laktak Gab eine bessere Lösung, das heißt, Überprüfung /proc/sys/kernel/osrelease, die 3.4.0-Microsoft für Windows Bash ist.

+0

Das ist eine vernünftige Heuristik, aber jemand könnte eine Windows-Festplatte als '/ mnt/c' in einer Umgebung, die nicht Windows ist, mounten lassen. – tripleee

+1

@tripleee Messepunkt. Aber das ist die beste Lösung, die ich mir vorstellen kann. Haben Sie bessere Lösungen? – PragmaticEd

+0

@PragmaticEd Sie Sir, verdienen einen Keks. Mein Wissen über W10 Bash ist begrenzt, aber kann ich auch vorschlagen, nach installierter Software oder ENV var zu suchen, die nur in Linux und nicht auf W10 vorhanden sind? –

Verwandte Themen