2016-06-28 17 views
11

Dość proste, zwykłe miejsca, w których można się zorientować, że system operacyjny, na którym się znajdujesz, wydaje się identyczny z prostym Ubuntu w systemie Ubuntu dla systemu Windows. Na przykład uname -a jest identyczny z rodzimą instalacją GNU/Linux, a /etc/os-version jest identyczna z instalacją Ubuntu Trusty Tahr.Jak sprawdzić, czy program jest uruchamiany w Bash w systemie Ubuntu w systemie Windows, a nie w zwykłym Ubuntu?

Jedyne, co mogę wymyślić, to sprawdzić, czy istnieje /mnt/c/Windows, ale nie jestem pewien, czy to niezawodny pomysł.

Odpowiedz

5

Szukałem również sposobów, aby to wykryć. Do tej pory znalazłem 2.

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

  • /proc/version to „wersja Linux 3.4.0-Microsoft ([email protected]) (wersja gcc 4,7 (GCC)) # 1 SMP PREEMPT Wed 31 grudnia 2014" 14:42:53 CET

Jeśli wystarczy użyć dystrybucji Ubuntu zainstalowane domyślnie nie powinno być żadnych problemów z ich użyciem, jak they said that it would be unlikely for them to set either to something that doesn't contain "Microsoft" or "WSL".

Jeśli jednak zainstalowałeś inną dystrybucję Linuksa, jestem pewien, że zawartość /proc/sys/kernel/osrelease i /proc/version zmieni się, ponieważ dystrybucja nie zostałaby skompilowana przez firmę Microsoft.

+0

Ponieważ procfs jest emulowane przez system Windows, to powinien (co do zasady, jak podano w komentarzu GitHub) zawsze zawierają te ciągi Microsoft, niezależnie od stosowanej dystrybucji, więc ostatni akapit wydaje mi się mylić. –

+1

@GuillemJover, to zależy od tego, czy hipotetyczny inny rozkład używa WSL czy nie, tak myślę. Nie wiem, czy Cygwin emuluje tę funkcjonalność, ale jeśli tak, to nie wyobrażam sobie, że powiedziałoby to Microsoft. (Chociaż wydaje mi się, że w napisie może pojawić się wyrażenie "Microsoft Windows". Założę się, że "[email protected]" nie będzie!) –

+0

@HarryJohnston Pod Cygwin, '/ proc/version' zawiera ciąg zaczynający się od" CYGWIN_NT " , a '/ proc/sys/kernel/osrelease' w ogóle nie istnieje. – duskwuff

10

następujących utworów w bash na systemie Windows 10, MacOS i Linux:

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

trzeba sprawdzić zarówno "Microsoft" i "WSL" za this comment Ben Hillis, WSL autorów:

Na razie jest to prawdopodobnie najlepszy sposób na zrobienie tego. Nie mogę obiecać, że nigdy nie zmienimy zawartości tych plików ProcFs, ale Myślę, że jest mało prawdopodobne, że zmienimy to na coś, co nie zawiera w sobie "Microsoft" lub "WSL".

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

właśnie wymyślił to dla mojego .bashrc za dodanie niektórych elementów WSL do $ PATH.

Działa w 1703 roku. Nie wiem, czy wcześniejsze wersje.

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