2016-06-28 16 views
11

Piuttosto semplice, i soliti posti per capire il sistema operativo in cui ti trovi sembrano identici a quelli di Ubuntu su Ubuntu per Windows. Ad esempio uname -a è identico a un'installazione GNU/Linux nativa e /etc/os-version è identico a un'installazione Ubuntu Trusty Tahr.Come verificare se un programma viene eseguito in Bash su Ubuntu su Windows e non solo su Ubuntu?

L'unica cosa che posso pensare è di verificare se esiste il numero /mnt/c/Windows, ma non sono sicuro che sia un'idea infallibile.

risposta

5

Sono stato alla ricerca di modi per rilevare anche quello. Finora ho trovato 2.

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

  • /proc/version è "la versione Linux 3.4.0-Microsoft ([email protected]) (versione gcc 4.7 (GCC)) # 1 SMP PREEMPT mer 31 dic 14:42:53 PST 2014"

se si utilizza la distribuzione Ubuntu installato di default non ci dovrebbero essere problemi con il loro utilizzo, come they said that it would be unlikely for them to set either to something that doesn't contain "Microsoft" or "WSL".

Tuttavia, se si dovesse installare una diversa distribuzione Linux, sono abbastanza sicuro che il contenuto di /proc/sys/kernel/osrelease e /proc/version cambierà, poiché la distro non sarebbe stata compilata da Microsoft.

+0

Poiché i procfs viene emulato da Windows, si deve (in linea di principio, come dichiarato sul commento Github) contengono sempre quelle corde Microsoft, indipendentemente dalla distribuzione usata, così l'ultimo paragrafo sembra confuso per me. –

+1

@GuillemJover, a seconda che l'ipotetica altra distribuzione stia utilizzando WSL o meno, immagino. Non so se Cygwin emuli quella funzionalità, ma se lo fa, non immagino che direbbe Microsoft. (Anche se immagino che la frase "Microsoft Windows" possa apparire nella stringa. Scommetto che "[email protected]" non lo farà!) –

+0

@HarryJohnston Sotto Cygwin, '/ proc/version' contiene una stringa che inizia con" CYGWIN_NT " e '/ proc/sys/kernel/osrelease' non esiste affatto. – duskwuff

10

le seguenti opere in bash su Windows 10, MacOS e Linux:

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

è necessario controllare sia per "Microsoft" e "WSL" per this comment da Ben Hillis, WSL Developer:

Per il momento questo è probabilmente il modo migliore per farlo. Non posso promettere che non cambieremo mai il contenuto di questi file ProcFs, ma Penso che sia improbabile che lo modificheremo in qualcosa che non contiene "Microsoft" o "WSL".

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

Ho appena si avvicinò con questo per il mio .bashrc per l'aggiunta di alcuni elementi WSL a $ PATH.

Lavori nel 1703. Non sono sicuro se versioni precedenti.

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